Php 检测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

例如,我们有以下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]
之间的
-标记(本例中为“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。