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 (! но только со значением >ААА!). Я не знаю, сколько у меня "foo", поэтому я не могу точно написать что-то вроде:

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

Итак, как я могу получить значение baz, следующего за bar с определенным значением?

(Для приведенного выше примера я хотел бы получить sometext, потому что он идет после AAA)


person kkkwww    schedule 21.08.2011    source источник


Ответы (2)


Базовым запросом будет поиск bar, содержащих AAA, а затем переход к соответствующему элементу baz.

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

Или найдите все baz и отфильтруйте на основе связанных bar.

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

Или bazs в пределах foos, содержащих bar, имеющих AAA.

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

Если вы не знакомы с выражениями XPath, добавьте в закладки Язык пути XML (XPath), чтобы использовать его позже.

person salathe    schedule 21.08.2011

Существуют разные способы написания сопоставления XPath в зависимости от того, как именно вы хотите выполнить сопоставление. Вот несколько вариантов:

Найдите baz, где также есть <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

Найдите <bar>AAA</bar> и верните любой элемент, идущий сразу после него, не обязательно с именем baz.

foo/bar[. = 'AAA']/following-sibling::*[1]
person John Kugelman    schedule 21.08.2011