从XML DOM List获取属性值

时间:2016-07-20 07:04:28

标签: php xml dom xml-parsing

我有一个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;
    }
}

任何人都可以帮助解决我在这里做错的事吗?

1 个答案:

答案 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