2 Stimmen

Hilfe beim Zugriff auf xml-Attribute in php

Ich bin neu in PHP und Programmierung im Allgemeinen. Ich versuche, Xml von einem entfernten Gerät zu analysieren und auf bestimmte Wertdaten zuzugreifen. Ich möchte z.B. den Wert der Gruppe 9 Probe 1 anzeigen und bekomme es nicht zum Laufen. Irgendwelche Tipps?

Hier ist die 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>

Hier ist mein php-Code zum Einlesen der 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;
?> 

Ein print_r($xml); zeigt die folgende Information:

    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
                                )

                        )

                )

        )

)

2voto

Brian Driscoll Punkte 18851

Versuchen Sie stattdessen dies:

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

0 Stimmen

Das war's! Ich musste nur noch den /value an das Ende des xpath setzen

1 Stimmen

@Brian Driscoll: /Device/Group[@id="9"]/Probe[@id="1"]/Value wäre besser. Beginnen Sie niemals einen Ausdruck mit // Betreiber.

0 Stimmen

@Alejandro Hm? Warum nicht?

2voto

Alex Jasmin Punkte 38232

Sie müssen den HTTP-Header aus der HTTP-Antwort entfernen, sonst erhalten Sie kein gültiges XML-Dokument. Abhängig von Ihrer Hosting-Umgebung können Sie möglicherweise eine HTTP-URL an simplexml_load_file() was viel einfacher ist als das, was Sie tun.

Auch Ihr xpath funktioniert nicht, da bei XML-Attributen und Tag-Namen zwischen Groß- und Kleinschreibung unterschieden wird.

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

Sind all diese Bindestriche in der XML-Quelle nur ein Problem beim Kopieren/Einfügen?

0voto

VolkerK Punkte 93746
<?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>');
}

druckt

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

siehe auch: http://docs.php.net/simplexml.examples-basic y http://www.w3.org/TR/xpath/

0voto

user1937014 Punkte 11

Xml:

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

php:

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

oder >= php5.3

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

Ergebnis:

5

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X