Разрывы строк создают текстовые узлы в DOMDocument - как мне это сделать - PullRequest
3 голосов
/ 19 сентября 2019

Я использую библиотеку php DOMDocument и читаю XML-строку с loadXML .Затем я перебираю дочерние элементы узла, помеченного «Info», с таким кодом:

$doc = new \DOMDocument();
$doc->loadXML(
'<?xml version="1.0" encoding="UTF-8"?>
<GAEB xmlns="http://www.gaeb.de/GAEB_DA_XML/DA31/3.2">
 <Info>
  <Version>3.2</Version>
  <VersDate>2013-10</VersDate>
  <Date>2014-10-10</Date>
  <Time>12:28:28</Time>
  <ProgSystem>GAEB Zertifizierung</ProgSystem>
  <ProgName>BVBS</ProgName>
 </Info>
</GAEB>'
);

$Info = $doc->getElementsByTagName("Info");

foreach ($Info as $element) {
    echo "[". $element->nodeName. "]";
    $nodes = $element->childNodes;
    foreach ($nodes as $node) {
        echo "[" . $node->nodeName . "]";
        echo  $node->nodeValue;
    }
}

У этого узла 6 дочерних узлов, однако в итерации 13 запусков.Это потому, что есть пробельные символы, которые интерпретируются как Текстовые узлы .Если я посмотрю на каждый узел $node->nodeType, он покажет 1 для 6 реальных дочерних элементов и 3 для 7 дочерних элементов, содержимое которых равно \n.Вопрос в том, как мне с этим бороться?Это нормально, что DOMDocument содержит эти текстовые узлы, и я должен «продолжить» над ними что-то вроде if($node->nodeType===3) continue, или я бы попытался удалить эти пробелы ранее при загрузке XML.Простое удаление \n из входного xml не работает, потому что тогда пробелы между узлами (например, > <) интерпретируются как текстовые узлы.

образец файла

<?xml version="1.0" encoding="UTF-8"?>
<GAEB xmlns="http://www.gaeb.de/GAEB_DA_XML/DA31/3.2">
 <Info>
  <Version>3.2</Version>
  <VersDate>2013-10</VersDate>
  <Date>2014-10-10</Date>
  <Time>12:28:28</Time>
  <ProgSystem>GAEB Zertifizierung</ProgSystem>
  <ProgName>BVBS</ProgName>
 </Info>
</GAEB>

1 Ответ

2 голосов
/ 20 сентября 2019

Пустые узлы можно игнорировать с помощью опции LIBXML_NOBLANKS следующим образом:

$doc->loadXML($xml, LIBXML_NOBLANKS);
...