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

在具有重复节点的文档中使用XPath与XMLReader和XMLReader-iterators.php,php,xml,xpath,iterator,xmlreader,Php,Xml,Xpath,Iterator,Xmlreader,我在提取XML文件的某些部分时遇到问题 以XML为例: <toplevel> <profile> <technology type="java" /> <technology type="dotnet" /> <technology type="sdk" /> <technology type="webserver" /> <license interactive="false" />

我在提取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>
有人能帮我理解如何将结果缩小到“度量”部分中用户定义的度量吗?也许这可以通过XPath实现

谢谢大家!

编辑:

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

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

但我无法缩小迭代器的范围,仅从“度量”部分中获取度量。它仍然会出现在“事务”部分。

这里不需要迭代器。您可以通过和来实现这一点

您可以选择如下简单的元素:

$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;
}
这是

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