xpath-запрос к xpath-результату запроса - PullRequest
2 голосов
/ 26 июня 2010

например у нас есть этот 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» -теге. Я написал этот код:

$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?

Ответы [ 3 ]

8 голосов
/ 26 июня 2010

Для вашего второго XPath попробуйте это вместо: $ctags = $xpath->query("c", $b);

Этот второй XPath уже относится к узлу 'b' ... если я не ошибаюсь, относительный путь в выражениях PHP XPath требует, чтобы вы опустили ведущий '/'.

0 голосов
/ 15 августа 2012

Роберт Хуэй не ошибается

FYI //b выделяет все элементы типа b в любом месте документа, но с помощью / означает выбор корневого узла, поэтому /b/c пытается выбратькорневой узел b, имеющий дочерний узел c.Корневой узел - это элемент тела.

0 голосов
/ 26 июня 2010

К тому времени, когда вы переходите ко второму запросу, вы уже находитесь в элементе 'b'.Ваш код ищет "// b / b / c".Попробуйте использовать просто "/ c" во втором запросе.Вы также можете переместить это в один запрос с помощью "// b / c", если вы не хотите ничего делать с "b".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...