使用PHP解析复杂的XML

时间:2014-09-17 11:36:59

标签: php html arrays xml

我不是编程忍者,我的专长是其他东西。但我需要采用一个复杂的(大~5-3mb)XML文件并从中提取某些值,添加HTML并将其吐回到网页上。

让我特别挂断的部分最好通过以下示例解释:

有数百个元素看起来像这样:

<device id="1023">

每个人的“id”属性都有不同的编号。

嵌套在每个元素中的是几个这样的元素:

<sensor id="34222"> 

每个人的“id”属性也有不同的编号。

现在我需要做的是两次。我需要去具体的

<device> 

具有特定“id”属性的元素,并检索子元素的值,如

<name>  

然后作为一个单独的任务,我需要转到具有特定“id”属性的特定“sensor”元素,并检索子元素的值,如

<status>

我将需要查询的设备和传感器的特定“id”号,因此它将被静态定义。我需要抓取那些数据,这样我就可以将它和一些HTML代码写入某种变量,或者将它作为从PHP执行返回的数据吐回来。

此外,在您访问任何“设备”或“传感器”之前,有几个标签/元素,其中一些具有属性或“id”。一些“设备”或“传感器”元件具有多个具有不同属性“id”号的标签/元件。 下面是XML文件的示例。

我正在尝试做甚么可能吗?这让我的大脑全都扭曲了。谢谢你的帮助!!

<bldghvac>
<bldghvac-version>14.2.10.2114+</bldghvac-version>
<options>...</options>
    <sensortree>
        <nodes>
            <probenode id="20199">
            <name>Customer 1 (123.43.66.789)</name>
            <id>20199</id>
            <url>/probenode.htm?id=20199</url>
            <tags/>
            <priority>3</priority>
            <fixed>0</fixed>
            <status_raw>3</status_raw>
            <active>true</active>

                <group id="20255">
                <name>Some Town</name>
                <id>20255</id>
                <url>/group.htm?id=20255</url>
                <tags/>
                <priority>3</priority>
                <fixed>0</fixed>
                <status_raw>3</status_raw>
                <active>true</active>

                    <group id="21717">
                    <name>Group 1</name>
                    <id>21717</id>
                    <url>/group.htm?id=21717</url>
                    <tags/>
                    <priority>3</priority>
                    <fixed>0</fixed>
                    <status_raw>3</status_raw>
                    <active>true</active>   

                        <device id="20357">
                        <summary>0,13,0,0,0,0,0,0</summary>
                        <name>Dev1 Bldg 1</name>
                        <deviceicon>vendors.png</deviceicon>
                        <id>20357</id>
                        <url>/device.htm?id=20357</url>
                        <tags>vendors</tags>
                        <priority>3</priority>
                        <fixed>0</fixed>
                        <host>172.22.37.253</host>
                        <status_raw>3</status_raw>
                        <active>true</active>

                            <sensor id="20359">
                            <name>System Uptime</name>
                            <id>20359</id>
                            <url>/sensor.htm?id=20359</url>
                            <fixed>0</fixed>
                            <status_raw>3</status_raw>
                            <status>Up</status>
                            <datamode>0</datamode>
                            <lastvalue>58 Days</lastvalue>
                            <active>true</active>
                            </sensor>

                            <sensor id="20359">
                            <name>System Uptime</name>
                            <id>20359</id>
                            <url>/sensor.htm?id=20359</url>
                            <fixed>0</fixed>
                            <status_raw>3</status_raw>
                            <status>Up</status>
                            <datamode>0</datamode>
                            <lastvalue>58 Days</lastvalue>
                            <active>true</active>
                            </sensor>
                        </device>
                    </group>
                </group>
            </probenode>
        </nodes>
    </sensortree>
</bldghvac>

1 个答案:

答案 0 :(得分:0)

好像您想要访问XML的几个字段。由于它总是以相同的方式工作,我只是在这里展示一个例子:

从设备“20357”获取传感器“20359”的状态,以及该设备的名称

当所有节点具有相同名称时,它们都是通过节点进行循环(使用foreach),并使用$elem->attributes()检查属性

$group = $xml->sensortree->nodes->probenode->group->group;

$wanted_device = 20357;
$wanted_sensor = 20359;

foreach ($group->device as $device) {
  $attributes = $device->attributes();
  if ($attributes['id'] == $wanted_device) {
    $device_name = $device->name;
    foreach ($device->sensor as $sensor) {
      $attributes = $sensor->attributes();
      if ($attributes['id'] == $wanted_sensor) {
        $sensor_status = $sensor->status;
      }
    }
  }
}

echo $device_name;
echo "\n";
echo $sensor_status;

输出:

  

Dev1 Bldg 1

     

向上

如果您难以获得特定节点,请告诉我,但这基本上就是它的工作方式。