3

私がこれを持っているとしましょう:

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

ここで、値AAAを持つbarの直後に来るbaz値を取得したいと思います(! ただし、値AAAのみ!)。「foo」がいくつあるかわからないので、次のように正確に書くことはできません。

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

では、特定の値を持つ bar の後に続く baz の値を取得するにはどうすればよいでしょうか?

(上記の例では、 AAAの後に来るため、何らかのテキストを取得したいと考えています)

4

2 に答える 2

6

一致をどのように実行したいかによって、一致する XPath を記述するさまざまな方法があります。以下にいくつかのオプションを示します。

ただし<bar>AAA</bar>、必ずしもその前にあるとは限りません (後に来るか、間に他の要素がある可能性があります)。

foo[bar = 'AAA']/baz

で始まる baz を検索し<bar>AAA</bar>ます。

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

の直前にある baz を検索し<bar>AAA</bar>ます。

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

a を見つけて、<bar>AAA</bar>その直後にある要素を返します。必ずしも baz という名前である必要はありません。

foo/bar[. = 'AAA']/following-sibling::*[1]
于 2011-08-21T16:09:59.747 に答える
2

基本的なクエリは、barを含むを検索AAAし、対応するbaz要素に移動することです。

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

または、すべてbazを検索し、関連する に基づいてフィルタリングしますbar

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

または、を含むbaz内の。foobarAAA

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

XPath 式に慣れていない場合は、XML パス言語 (XPath)をブックマークしておいてください。

于 2011-08-21T16:06:45.663 に答える