Php 检测xml中的节点
例如,我们有以下xml:Php 检测xml中的节点,php,xml,xpath,Php,Xml,Xpath,例如,我们有以下xml: <p>[TAG] <span>foo 1</span> <span>foo 2</span> [/TAG] <span>bar 1</span> <span>bar 2</span> </p> [标签] 富1 富2 [/TAG] 酒吧1 酒吧2 如何检测单词[TAG]和[/TAG]之间的-标记(本例中为“fo
<p>[TAG]
<span>foo 1</span>
<span>foo 2</span>
[/TAG]
<span>bar 1</span>
<span>bar 2</span>
</p>
[标签]
富1
富2
[/TAG]
酒吧1
酒吧2
如何检测单词[TAG]
和[/TAG]
之间的
-标记(本例中为“foo 1”和“foo 2”)
UPD.例如,我需要更改
[TAG]
和[/TAG]
之间每个跨度的节点值,假设每个节点只有一组[TAG]..[/TAG]
(例如,如果您的文档有两组,则它们位于单独的
元素或其他元素中),并且它们总是兄弟节点:
您可以使用前面的同级和后面的同级仅选择前面有[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();
“detect”是什么意思?例如,我需要更改
[TAG]
和[/TAG]
这[TAG]foo 1[/TAG][TAG]foo 1[/TAG TAG]/code>xml不能仅通过xpath查询解析,对吗?@cru3l-当然可以。只需去掉前面的兄弟姐妹
和后面的兄弟姐妹
@Dimitre中的-兄弟姐妹
,但在所有给定的示例中,“标记”都位于它们自己的文本节点中,因此我们可以很高兴地在XPath中使用它们queries@Chris-史密斯:一点也不。如果你仔细看上面@cru3l的第一条评论,你会发现:[TAG]foo1[/TAG]
。如您所见,其中的最后一个标记是未关闭的
。这不可能“选择”XPath。