Обход DOM, DomNodeList с использованием php - PullRequest
0 голосов
/ 30 апреля 2018

Я хотел бы спросить, почему узел запроса "groups" может дать мне некоторые результаты (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) }

Спасибо

Please see DOM picture

1 Ответ

0 голосов
/ 30 апреля 2018

В ваших выражениях 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

...