我无法提取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++;
}
}
但我无法缩小迭代器,只是从“措施”部分中选择措施。它仍然会在“交易”部分查找。
答案 0 :(得分:1)
这里不需要迭代器。您可以使用SimpleXML和XPath来实现此目的。
您可以选择简单的元素:
$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。