在具有重复节点的文档中将 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。
我在提取 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。