在具有重复节点的文档中使用带有XMLReader和xmlreader-iterators.php的XPath

时间:2016-10-03 21:09:20

标签: php xml xpath iterator xmlreader

我无法提取XML文件的某些部分。

以XML为例:

<toplevel>
 <profile>
  <technology type="java" />
  <technology type="dotnet" />
  <technology type="sdk" />
  <technology type="webserver" />
  <license interactive="false" />
  <groups></groups>
  <sensors></sensors>
  <measures>
   <measure id="example-name1" userdefined="true"></measure>
   <measure id="example-name2" userdefined="false"></measure>
  </measures>
  <transaction>
   <value>
    <measure id="example-name3" userdefined="true"></measure>
   </value>
  </transaction>
 </profile>
</toplevel>

我正在使用Iterators for PHP XMLReader(https://gist.github.com/hakre/5147685)来遍历这个大文档,并只读取名为“measures”的节点。不幸的是,文档中还有第二部分也包含“度量”。最重要的是,有用户定义和非用户定义的度量,我只想'userdefined =“true”'度量。

到目前为止我的代码是:

require('xmlreader-iterators.php'); 
$xmlFile = "../xml/measures.xml";

$readerMeasures = new XMLReader();
$readerMeasures->open($xmlFile);
$dataMeasures = array();

$measures = new XMLElementIterator($readerMeasures, 'measure');
foreach ($measures as $measure) {
  $item = $measure->getAttribute('id');
  array_push($dataMeasures, $item);
} 

有人可以帮助我了解如何将我的结果范围缩小到“措施”部分中用户定义的衡量标准吗?也许这可以用XPath完成?

谢谢!

编辑:

我整理了用户定义的部分:

foreach ($measures as $measure) {
  $userdefined = $measure->getAttribute('userdefined');
  $measure_name = $measure->getAttribute('id');
  if ($userdefined=="true") {
    echo "$measure_name<br>";
    $count++;
  }
}

但我无法缩小迭代器,只是从“措施”部分中选择措施。它仍然会在“交易”部分查找。

1 个答案:

答案 0 :(得分:1)

这里不需要迭代器。您可以使用SimpleXMLXPath来实现此目的。

您可以选择简单的元素:

$xml = new SimpleXMLElement($xml);

$measures = $xml->xpath('//measures/measure[@userdefined="true"]');

然后你可以循环选定的项目:

foreach ($measures as $measure) {
    echo 'id: ', $measure['id'], PHP_EOL;
    echo 'value: ', $measure, PHP_EOL;
    echo PHP_EOL;
}

这是working demo