2010-08-03 114 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