Предположим, у меня это:
<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 , которое появляется сразу после бара со значением AAA (!, но только со значением AAA !). Я не знаю, сколько у меня «foo», поэтому я не могу точно написать что-то вроде:
$element->item(0) // I don't know the exact number
Итак, как я могу получить значение baz, которое следует за баром с определенным значением?
(В приведенном выше примере я хотел бы получить sometext, потому что он появился после AAA )
Основной запрос состоял бы в том, чтобы найти bar
s, которая содержит AAA
, а затем перейти к соответствующему элементу baz
.
//foo/bar[.="AAA"]/../baz
Или найдите все baz
и фильтры на основе соответствующего bar
.
//foo/baz[../bar = "AAA"]
Или baz
s внутри foo
s, содержащего bar
имеющий AAA
.
//foo[bar="AAA"]/baz
Если вы не знакомы с выражениями XPath, залейте XML Path Language (XPath) позже.
Существуют разные способы написания сопоставления 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]