DOMXPath получает брата в зависимости от предыдущего значения брата - PullRequest
3 голосов
/ 21 августа 2011

Допустим, у меня есть это:

<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, которое следует после бара сконкретное значение?

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

Ответы [ 2 ]

6 голосов
/ 21 августа 2011

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

Найти базу, где есть также <bar>AAA</bar>, хотя не обязательно предшествующий ему (хотя он может следовать после или между ними могут быть другие элементы):

foo[bar = 'AAA']/baz

Найти базу, которой предшествует <bar>AAA</bar>:

foo/baz[preceding-sibling::bar = 'AAA']
foo/bar[. = 'AAA']/following-sibling::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]
2 голосов
/ 21 августа 2011

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

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

Или найдите все baz и выполните фильтрацию на основе связанного bar.

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

Или baz с в foo с, содержащем bar с AAA.

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

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

...