2010-08-03 6 views
2

Je suis novice en PHP et en codage en général. J'essaye d'analyser XML à partir d'un périphérique distant et d'accéder à des données de valeur spécifiques. Je voudrais afficher la valeur du groupe 9 sonde 1 par exemple et je ne peux pas le faire fonctionner. Des conseils?Aide pour accéder à l'attribut xml dans php

Voici le xml:

<?xml version="1.0" encoding="ISO-8859-1" ?> 
- <Device id="S10011" hb="1935"> 
    <Group id="1" /> 
    <Group id="2" /> 
    <Group id="3" /> 
    <Group id="4" /> 
    <Group id="5" /> 
    <Group id="6" /> 
    <Group id="7" /> 
    <Group id="8" /> 
- <Group id="9"> 
- <Probe id="99"> 
    <Value>1.0</Value> 
    </Probe> 
- <Probe id="1"> 
    <Value>86.4</Value> 
    </Probe> 
- <Probe id="2"> 
    <Value>45.7</Value> 
    </Probe> 
- <Probe id="3"> 
    <Value>2.9</Value> 
    </Probe> 
- <Probe id="4"> 
    <Value>1.0</Value> 
    </Probe> 
    </Group> 
    </Device> 

Voici mon code php pour lire dans le xml:

<?php 
    // Establish a port 80 connection 
    $http = fsockopen("192.168.2.106",80); 

    // Send a request to the server 
    $req = "GET /xmldata HTTP/1.0\r\n"; 
    $req .= "Host: 192.168.2.106\r\n"; 
    $req .= "Connection: Close\r\n\r\n"; 
    fputs($http, $req); 

    // Output the request results 
    while(!feof($http)) { 
     $xmlstr .= fgets($http, 2048); 
    } 
    // Close the connection 
    fclose($http); 


    $xml = simplexml_load_string($xmlstr); 

    print_r($xml); 

    $myValue = $xml->xpath('//Group[@ID="9"]/Probe[@ID="1"]/value'); 
    echo $myValue; 
?> 

A print_r ($ xml); montre les informations suivantes:

SimpleXMLElement Object 
(
    [@attributes] => Array 
     (
      [id] => S10011 
      [hb] => 158221 
     ) 

    [Group] => Array 
     (
      [0] => SimpleXMLElement Object 
       (
        [@attributes] => Array 
         (
          [id] => 1 
         ) 

        [0] => 

       ) 

      [1] => SimpleXMLElement Object 
       (
        [@attributes] => Array 
         (
          [id] => 2 
         ) 

        [0] => 

       ) 

      [2] => SimpleXMLElement Object 
       (
        [@attributes] => Array 
         (
          [id] => 3 
         ) 

        [0] => 

       ) 

      [3] => SimpleXMLElement Object 
       (
        [@attributes] => Array 
         (
          [id] => 4 
         ) 

        [0] => 

       ) 

      [4] => SimpleXMLElement Object 
       (
        [@attributes] => Array 
         (
          [id] => 5 
         ) 

        [0] => 

       ) 

      [5] => SimpleXMLElement Object 
       (
        [@attributes] => Array 
         (
          [id] => 6 
         ) 

        [0] => 

       ) 

      [6] => SimpleXMLElement Object 
       (
        [@attributes] => Array 
         (
          [id] => 7 
         ) 

        [0] => 

       ) 

      [7] => SimpleXMLElement Object 
       (
        [@attributes] => Array 
         (
          [id] => 8 
         ) 

        [0] => 

       ) 

      [8] => SimpleXMLElement Object 
       (
        [@attributes] => Array 
         (
          [id] => 9 
         ) 

        [Probe] => Array 
         (
          [0] => SimpleXMLElement Object 
           (
            [@attributes] => Array 
             (
              [id] => 99 
             ) 

            [Value] => 2.0 
           ) 

          [1] => SimpleXMLElement Object 
           (
            [@attributes] => Array 
             (
              [id] => 1 
             ) 

            [Value] => 89.6 
           ) 

          [2] => SimpleXMLElement Object 
           (
            [@attributes] => Array 
             (
              [id] => 2 
             ) 

            [Value] => 42.7 
           ) 

          [3] => SimpleXMLElement Object 
           (
            [@attributes] => Array 
             (
              [id] => 3 
             ) 

            [Value] => 3.9 
           ) 

          [4] => SimpleXMLElement Object 
           (
            [@attributes] => Array 
             (
              [id] => 4 
             ) 

            [Value] => 1.0 
           ) 

         ) 

       ) 

     ) 

) 

Répondre

2

Essayez ceci:

$myValue = $xml->xpath('//Group[@id="9"]/Probe[@id="1"]/Value'); 
    echo $myValue[0]; 
+0

qui l'a fait! tout ce que je devais faire était de mettre la valeur/à la fin du xpath aussi bien – Mike

+1

@Brian Driscoll: '/ Device/Groupe [@ id =" 9 "]/Probe [@ id =" 1 "]/Value' être meilleur. Ne commencez jamais une expression avec l'opérateur '//'. –

+0

@Alejandro huh? pourquoi pas? – Gordon

0
<?php 
$device = getDoc(); 
// iterate over all Group elements that have one or more Probe elements that have one or more Value elements. 
foreach($device->xpath('Group[Probe/Value]') as $group) { 
    echo 'Group id=', $group['id'], "\n"; 
    foreach($group->Probe as $probe) { 
    echo ' probe id=', $probe['id'], "\n"; 
    foreach($probe->Value as $value) { 
     echo ' value=', $value, "\n"; 
    } 
    } 
} 

function getDoc() { 
    return new SimpleXMLElement('<?xml version="1.0" encoding="ISO-8859-1" ?> 
    <Device id="S10011" hb="1935"> 
     <Group id="1" /> 
     <Group id="2" /> 
     <Group id="3" /> 
     <Group id="4" /> 
     <Group id="5" /> 
     <Group id="6" /> 
     <Group id="7" /> 
     <Group id="8" /> 
     <Group id="9"> 
     <Probe id="99"> 
     <Value>1.0</Value> 
     </Probe> 
     <Probe id="1"> 
     <Value>86.4</Value> 
     </Probe> 
     <Probe id="2"> 
     <Value>45.7</Value> 
     </Probe> 
     <Probe id="3"> 
     <Value>2.9</Value> 
     </Probe> 
     <Probe id="4"> 
     <Value>1.0</Value> 
     </Probe> 
     </Group> 
    </Device>'); 
} 

impressions

Group id=9 
    probe id=99 
    value=1.0 
    probe id=1 
    value=86.4 
    probe id=2 
    value=45.7 
    probe id=3 
    value=2.9 
    probe id=4 
    value=1.0 

voir aussi: http://docs.php.net/simplexml.examples-basic et http://www.w3.org/TR/xpath/

+0

cela fonctionne aussi, merci! – Mike

2

Vous devez enlever la HTT P en-tête de la réponse HTTP ou vous n'obtiendrez pas un document XML valide. En fonction de votre environnement d'hébergement, vous pouvez transmettre une URL HTTP à simplexml_load_file(), ce qui est beaucoup plus simple que ce que vous faites.

Votre xpath ne fonctionne pas non plus car les attributs XML et les noms de tag sont sensibles à la casse.

$xml = simplexml_load_file("http://192.168.2.106/xmldata"); 
$myValue = $xml->xpath("//Group[@id='9']/Probe[@id='1']/Value"); 
echo $myValue[0]; 

Tous ces tirets dans la source XML sont-ils simplement un problème de copier/coller?

0

xml:

<root><item attrname="5"/></root> 

php:

$var = $xml->xpath('root/item/@attrname'); 
echo $var[0]; 

ou> = PHP5.3

$var = $xml->xpath('root/item/@attrname')[0]; 
echo $var; 

Résultat:

5