【发布时间】:2015-07-09 05:01:03
【问题描述】:
我无法使用 PHP's SimpleXMLIterator 处理 XML 数据。
在迭代一个子树 (/root/entries) 的节点时,我尝试从另一个子树 (/root/entryvalues) 收集相关数据 - 通过 当前节点 的属性匹配目标节点。
因此,我会在 当前节点(“上下文”;标有注释)上使用 XPath,试图从 (/root/entryvalues) 获取那些具有entry parent 与 当前节点具有相同的 name 属性值 ("foo")。
<root>
<entries>
<entry name="foo"><!-- <- XPath starts here ("Context") -->
<somedata>1234</somedata>
</entry>
<entry name="bar">
<somedata>asdf</somedata>
</entry>
...
</entries>
<somethingUnrelated />
<entryvalues>
<entry name="foo"><!-- <- want to select subnodes of this node -->
<entryvalue name="foo1">
<text>Foo 1</text>
</entryvalue>
...
<entryvalue name="foo-n">
<text>Foo n</text>
</entryvalue>
</entry>
<!-- no "bar" here -->
<entry name="quux">
<entryvalue name="quux1">
<text>Quux 1</text>
</entryvalue>
</entry>
...
</entryvalues>
</root>
一个有效的 XPath 2.0 表达式可能类似于 parent::*/following-sibling::entryvalues/entry[@name = current()[@name]],但我没有 XPath 2.0,所以没有 current() 函数。
如何获得这些节点?
供参考,这里是相关的PHP sn-p:
$xml = new \SimpleXMLIterator($xmldata);
foreach ($xml->xpath('//root/entries/entry') as $entry) {
// ... extract some data from $entry
$entryvalues = $entry->xpath('???');
doSomething($entry, $entryvalues);
}
【问题讨论】:
标签: php xpath xml-parsing