например, у нас есть этот xml:
<body> <a> <b> <c>hello</c> <c>world</c> </b> </a> <a> <b> <c>another hello</c> <c>world</c> </b> </a> </body>
по запросу Xpath мы можем найти все «B» -теги. Но тогда нам нужно найти все «C» -таг в каждом найденном «B» -tag. Я написал этот код:
$dom = new DOMDocument(); $dom->loadXML($xml); $xpath = new DOMXPath($dom); $btags = $xpath->query("//b"); foreach ($btags as $b) { $ctags = $xpath->query("/b/c", $b); foreach ($ctags as $c) { echo $c->nodeValue; } }
Но это не сработает. Это можно сделать с помощью запроса XPath?
Для второго XPath попробуйте это вместо: $ctags = $xpath->query("c", $b);
Этот второй XPath уже относится к узлу 'b' … если я не ошибаюсь, относительное перемещение в инструкциях PHP XPath требует, чтобы вы опустили ведущий '/'.
Вы уже находитесь в элементе «b» к моменту получения второго запроса. Что ваш код ищет, это «// b / b / c». Вместо этого попробуйте использовать только «/ c» во втором запросе. Вы также можете переместить это в один запрос с помощью «// b / c», если вы не хотите ничего делать с «b».
Роберт Хуэй не ошибается
FYI //b
выбирает все элементы, которые являются типом b в любом месте документа, но использует /
означает для выбора корневого узла, поэтому /b/c
пытается выбрать корневой узел b, у которого есть дочерний узел c
. Корневой узел – это элемент тела.