【发布时间】:2013-05-02 15:12:51
【问题描述】:
在以下 XML 文件中,我尝试打印所有 TestItem 节点,但只获取 4 个 outer 节点。
请问有人知道,如何打印具有该名称的每个节点,无论它们的位置如何?
data.xml:
<?xml version="1.0"?>
<Tests>
<TestItem Name="UpdateBootProfile" Result="PASS" />
<TestItem Name="NRB Boot" Result="PASS">
<TestItem Name="Boot Test" Result="PASS">
<TestItem Name="PreparePowerSupply" Result="PASS" />
<TestItem Name="ApplyBatteryVoltage" Result="PASS" />
<TestItem Name="Shelf Mode test" Result="PASS">
</TestItem>
<TestItem Name="ApplyUSBVoltage" Result="PASS" />
<TestItem Name="DetectBoard" Result="PASS" />
<TestItem Name="Device Current Profile" Result="PASS" />
<TestItem Name="Device Connection" Result="PASS">
</TestItem>
</TestItem>
</TestItem>
<TestItem Name="Check device Type" Result="PASS" />
<TestItem Name="Assign BSN and Erase EFS" Result="PASS">
</TestItem>
</Tests>
parse.php:
<?php
$tmp = 'data.xml';
$str = file_get_contents($tmp);
$xml = new SimpleXMLElement($str);
$items = $xml->xpath('TestItem');
while(list( , $test) = each($items)) {
printf("%s %s\n", $test['Name'], $test['Result']);
}
?>
php -f parse.php 输出(为什么只列出4个TestItem?):
UpdateBootProfile PASS
NRB Boot PASS
Check device Type PASS
Assign BSN and Erase EFS PASS
在 CentOS 6.3 命令行上使用 PHP 5.3.5。
更新:
建议的//TestItem 适用于我上面的简单测试用例,谢谢。
但我的真实数据仍然失败(我无法在此处粘贴):
# grep -w TestItem my_real_file_May_2013_09_35_38.xml |wc -l
143
# php -f parse.php |wc -l
86
有人想知道//TestItem会错过一些节点吗?
更新 2:
确实有效!由于一些 </TestItem> 结束标签,上面的 grep 突击队计算了更多行 :-)
【问题讨论】:
-
因为像
<TestItem>'. You have parent element`这样的父子元素没有区别, <TestItem>元素也一样。这不应该在那里。 -
将xml粘贴到pastebin并分享链接