我有一个XML文件(下面),我试图用PHP解析。
<content>
<row label='DEV'>
<cell href="exUrl('URL')" status='0'>12345</cell>
<cell href="exUrl('URL')" status='1'>12345</cell>
<cell href="exUrl('URL')" status='1'>12345</cell>
<cell href="exUrl('URL')" status='1'>12345</cell>
<cell href="exUrl('URL')" status='1'>12345</cell>
</row>
<row label='DEV2'>
<cell href="exUrl('URL')" status='1'>56789</cell>
<cell href="exUrl('URL')" status='1'>56789</cell>
<cell href="exUrl('URL')" status='1'>56789</cell>
<cell href="exUrl('URL')" status='1'>56789</cell>
<cell href="exUrl('URL')" status='0'>56789</cell>
</row>
</content>
我目前正在使用PHP从XML文档中总结一些“行”(例如下面的例子)。
$dom = new DOMDocument();
$html = $dom->loadHTMLFile("XML.xml");
$dom->preserveWhiteSpace = false;
$tables = $dom->getElementsByTagName('content');
$rows = $tables->item(0)->getElementsByTagName('row');
foreach ($rows as $row)
{
$cols = $row->getElementsByTagName('cell');
$totalValues += $cols->item(4)->nodeValue;
}
我已经更新了for循环以包含一个if语句来检查状态值,但是这似乎没有用。
foreach ($rows as $row)
{
$cols = $row->getElementsByTagName('cell');
$totalValues += $cols->item(4)->nodeValue;
if(($cols->item(4)->getElementsByTagName('status')->nodeValue) == 0) {
$flag = 0;
}
}
任何人都可以帮助解决我在这里做错的事吗?
答案 0 :(得分:1)
status
是属性节点,而不是元素节点。以下是获得价值的几种方法。最简单的方法是从元素节点读取它:
if ($cols->item(4)->getAttribute('status') == 0) { ...
或者您可以获取属性节点并读取其值。
if ($cols->item(4)->getAttributeNode('status')->value == 0) { ...
最后,您可以使用Xpath优化循环,并使用Xpath表达式设置$flag
。
$document = new DOMDocument();
$document->load($xmlFile);
$xpath = new DOMXpath($document);
$total = 0;
foreach ($xpath->evaluate('/content/row/cell[5]') as $cell) {
$total += $cell->nodeValue;
}
$flag = $xpath->evaluate('count(/content/row/cell[5][@status=0]) > 0');
var_dump($total, $flag);
第一个Xpath表达式/content/row/cell[5]
获取所有cell
个元素节点,这些节点在/content/row
内具有第五个位置。
在第二次进行中,该列表按status
属性的值进行过滤。计算cell
0的status
个节点。如果该计数大于0则表达式返回true
。