2010-08-03 93 views
2

我是新來的PHP和一般編碼。我試圖從遠程設備解析xml並訪問特定的值數據。例如,我想顯示組9探針1值,但無法使其工作。有小費嗎?幫助訪問php中的xml屬性

這裏是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> 

這裏是我的PHP代碼中的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; 
?> 

一的print_r($ XML);顯示以下信息:

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 
           ) 

         ) 

       ) 

     ) 

) 

回答

2

試試這個:

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

這做到了!我只需要把/值放在xpath結尾 – Mike 2010-08-03 20:22:06

+1

@Brian Driscoll:'/ Device/Group [@ id =「9」]/Probe [@ id =「1」]/Value' would會更好。切勿用'''運算符開始表達式。 – 2010-08-03 20:33:32

+0

@Ajjandro吧?爲什麼不? – Gordon 2010-08-03 20:46:31

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>'); 
} 

打印

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 

還看到:http://docs.php.net/simplexml.examples-basichttp://www.w3.org/TR/xpath/

+0

這也適用,謝謝! – Mike 2010-08-03 20:26:26

2

你必須剝離HTT來自HTTP響應的P標頭,否則您將無法獲得有效的XML文檔。根據您的託管環境,您可能能夠將HTTP URL傳遞到simplexml_load_file(),這比您所做的要簡單得多。

此外,您的xpath不起作用,因爲XML屬性和標記名稱區分大小寫。

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

XML源代碼中的所有這些破折號是否只是複製/粘貼問題?

0

XML:

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

PHP:

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

或> = PHP5.3

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

結果:

5