例如,我们有这个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
答案 0 :(得分:1)
假设每个节点只有一组[TAG]..[/TAG]
(如果您的文档有两个集合,则它们位于单独的<p>
元素或其他内容中),并且它们总是兄弟姐妹:
您可以使用preceding-sibling
和following-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();