检测xml中的节点

时间:2010-06-30 10:38:03

标签: php xml xpath

例如,我们有这个xml:

<p>[TAG]
    <span>foo 1</span>
    <span>foo 2</span>
   [/TAG]
    <span>bar 1</span>
    <span>bar 2</span>
</p>

如何检测<span> - 单词[TAG][/TAG]之间的标签(本例中为“foo 1”和“foo 2”)?

UPD。例如,我需要更改[TAG][/TAG]之间每个范围的nodeValue

1 个答案:

答案 0 :(得分:1)

假设每个节点只有一组[TAG]..[/TAG](如果您的文档有两个集合,则它们位于单独的<p>元素或其他内容中),并且它们总是兄弟姐妹:

您可以使用preceding-siblingfollowing-sibling仅选择前面有[TAG]文本节点并后跟[/ TAG]文本节点的元素:

//span[preceding-sibling::text()[normalize-space(.) = "[TAG]"]][following-sibling::text()[normalize-space(.) = "[/TAG]"]]

一个完整的PHP示例:

$doc = new DOMDocument();
$doc->loadHTMLFile('test.xml');

$xpath = new DOMXPath($doc);

foreach ($xpath->query('//span[preceding-sibling::text()[normalize-space(.) = "[TAG]"]][following-sibling::text()[normalize-space(.) = "[/TAG]"]]') as $el) {
 $el->nodeValue = 'Changed!';
}

echo $doc->saveXML();