PHP DOM получают детей, исключая текстовые узлы - PullRequest
0 голосов
/ 09 марта 2020

Как я могу получить только дочерние узлы без текстовых узлов? У меня есть следующий документ:

<Sys>
    <Const>
        <C1>A</C1>
        <C2>B</C2>
        <C3>C</C3>
    </Const>
</Sys>

Получение детей от "Const" Я получаю 6 элементов,

<?php
$doc = new DOMDocument();
$doc->load($file_path);

$constants = $doc->getElementsByTagName('Const')->item(0);

foreach ($constants->childNodes as $const) {
    echo $const->nodeName . ': ' . $const->nodeValue . '<br />';
}
?>

, которые печатаются:

#text:
C1: A
v#text:
C2: B
#text:
C3: C

Как я могу получить только узлы C1, C2 и C3, кроме текстовых узлов?

Ответы [ 2 ]

1 голос
/ 10 марта 2020

Вы можете использовать выражения Xpath для извлечения определенных c частей DOM.

  • Любой элемент "Const" //Const
  • Дочерние элементы "Const" //Const/*

Пример:

$xml = <<<'XML'
<Sys>
    <Const>
        <C1>A</C1>
        <C2>B</C2>
        <C3>C</C3>
    </Const>
</Sys>
XML;

$document = new DOMDocument();
$document->loadXML($xml);
$xpath = new DOMXpath($document);

foreach ($xpath->evaluate('//Const/*') as $constant) {
  echo $constant->nodeName . ': ' . $constant->textContent . "\n";
}

Выход:

C1: A
C2: B
C3: C
1 голос
/ 09 марта 2020

В примере, приведенном в вопросе, вы можете просто установить флаг preserveWhiteSpace в значение false, что не позволяет пробелам (новые строки, табуляции, пробелы и т. Д. c.) Создавать дополнительные текстовые узлы ...

$doc->preserveWhiteSpace = false;
$doc->load($file_path);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...