DOMXPath根据先前的兄弟值获取兄弟姐妹

时间:2011-08-21 15:52:57

标签: php xml dom domxpath

假设我有这个:

<foo>
    <bar>CCC</bar>
    <baz>sometexthere</baz>
</foo>
<foo>
    <bar>AAA</bar>
    <baz>sometext</baz>
</foo>
<foo>
    <bar>DDD</bar>
    <baz>something</baz>
</foo>

现在,我希望获得 baz 值,该值在 bar 之后,值 AAA (!但仅限于值 AAA !)。我不知道我有多少“foo”,所以我不能写出类似的东西:

$element->item(0) // I don't know the exact number

那么如何得到baz的值,它在具有特定值的bar之后呢?

(对于上面的例子,我想获得 sometext ,因为它来自 AAA

2 个答案:

答案 0 :(得分:6)

根据您希望如何执行匹配,有不同的方法来编写匹配的XPath。以下是一些选项:

找到一个baz,其中还有<bar>AAA</bar>,但不一定在它之前(它可能会在之后,或者之间可能还有其他元素):

foo[bar = 'AAA']/baz

找到以<bar>AAA</bar>开头的baz:

foo/baz[preceding-sibling::bar = 'AAA']
foo/bar[. = 'AAA']/following-sibling::baz

在[{1}}:

之前找到baz 立即
<bar>AAA</bar>

找到foo/baz[preceding-sibling::*[1]/self::bar = 'AAA'] foo/bar[. = 'AAA']/following-sibling::*[1]/self::baz 并返回紧随其后的任何元素,不一定命名为baz。

<bar>AAA</bar>

答案 1 :(得分:2)

基本查询是查找包含bar的{​​{1}},然后导航到相应的AAA元素。

baz

或者,找到所有//foo/bar[.="AAA"]/../baz 并根据关联的baz进行过滤。

bar

//foo/baz[../bar = "AAA"] 内的bazfoo包含bar AAA

//foo[bar="AAA"]/baz

如果您不熟悉XPath表达式,请将XML Path Language (XPath)标记为以后。