Обход DOM, DomNodeList с использованием переполнения стека

Я хотел бы спросить, почему узел запроса «команды» может дать мне некоторые результаты (count = 1, length = 1), но не «root» или «subteam». Все узлы «root, команды и subteam» относятся к типу Nodelist.

Если я не ошибаюсь, счет 1 представляет номер узла в списке … так почему «root» и «subteam» возвращают 0.

$dom = new DomDocument();
$string = <<<XML
<?xml version='1.0'?>
<root>
<teams>
<subteams>
<cmd>login</cmd>
<login>Richard</login>
</subteams>
</teams>

</root>
XML;


$dom->loadXML($string);

$xpath = new DomXPath($dom);
/*DOMNodeList*/
$queryNode = $xpath->query("subteams"); //length 0, count 0
//$queryNode = $xpath->query("root"); //length 0, count 0
//$queryNode = $xpath->query("teams"); //length 1, count 1

echo "length " . $queryNode->length . "<br>";
echo "count " . $queryNode->count() . "<br>";
var_dump( $queryNode); // only for teams node - object(DOMNodeList)#4 (1) { ["length"]=> int(1) }

Спасибо

Пожалуйста, смотрите изображение DOM

1

Решение

В ваших выражениях XPath отсутствуют разделители пути.

Например, если вы хотите все subteams в любом месте документа используйте

$queryNode = $xpath->query("//subteams");

Вы также можете использовать

$queryNode = $xpath->query("/root/team/subteams");

или же

$queryNode = $xpath->query("team/subteams");

"team" работает, потому что контекстом ваших запросов по умолчанию является элемент документа, т.е. <root>,

Увидеть https://www.w3.org/TR/xpath-30/#id-path-expressions

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]