我不是编程忍者,我的专长是其他东西。但我需要采用一个复杂的(大~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>
答案 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
向上
如果您难以获得特定节点,请告诉我,但这基本上就是它的工作方式。