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

Using XPath with XMLReader and xmlreader-iterators.php in a document with duplicate nodes

我在提取 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>

我正在使用 PHP XMLReader (https://gist.github.com/hakre/5147685) 的迭代器来遍历这个大文档并只读取名为 'measures' 的节点。不幸的是,文档中还有第二部分也包含 '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);
} 

有人可以帮助我了解如何将我的结果缩小到用户在 'measures' 部分中定义的度量吗?也许这可以用 XPath 来完成?

谢谢!

编辑:

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

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

但我无法将迭代器缩小到仅从 "measures" 部分中选取度量。它仍然在 "transactions" 部分中查找。

这里不需要迭代器。您可以使用 SimpleXML and XPath.

实现此目的

你会 select 像这样简单的元素:

$xml = new SimpleXMLElement($xml);

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

然后你可以遍历 selected 个项目:

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

这里是working demo