PHP DOM: вопрос новичка - PullRequest
1 голос
/ 11 октября 2008

Я только начал возиться с манипуляциями с XML с помощью PHP и наткнулся на что-то неожиданное. Вот XML, который я использую в качестве тестового ввода:

<list>
    <activity1> running </activity1>
    <activity2> swimming </activity2>
    <activity3> soccer </activity3>
</list>

Теперь я ожидал, что этот код PHP будет выводить 'activity1':

$xmldoc = new DOMDocument();
$xmldoc->load('file.xml');

//the line below would make $root the <list> node
$root = $xmldoc->firstChild;

//the line below would make $cnode the first child 
//of the <list> node, which is <activity1>
$cnode = $root->firstChild;

//this should output 'activity1'
echo 'element name: ' . $cnode->nodeName;

Вместо этого этот код выводит #text. Я мог бы исправить это, вставив новую строку в код перед печатью имени узла:

$cnode = $cnode->nextSibling;

Теперь, я бы ожидал, что вместо этого будет напечатано 'activity2', но печатает 'activity1'. Что происходит?

Ответы [ 4 ]

1 голос
/ 11 октября 2008

Если вы используете XPath для запроса своего документа, вам не нужно беспокоиться об этом типе тайн. Используйте DOMDocument::xpath_eval() для оценки шаблона /list/*, и все, что вы получите, это дочерние элементы элемента верхнего уровня list, несмотря ни на что.

1 голос
/ 11 октября 2008

Чтобы получить ожидаемое поведение, вам нужно передать LIBXML_NOBLANKS в качестве второго параметра вашего вызова load ()

<?php
$xmldoc = new DOMDocument();
$xmldoc->load('file.xml', LIBXML_NOBLANKS);
?>
1 голос
/ 11 октября 2008

Первый узел - это текст (в данном случае пробел) между открывающим тегом списка и тегом Activity1, следующий узел - это элемент action1 . элементы не совпадают с узлами.

0 голосов
/ 11 октября 2008

Примечание к ответу Czimi: удаление только пробельных узлов не помешает вам проверить тип узла (будь то элемент, текстовый узел, комментарий ...). В общем, если вас интересует только выбор узлов элементов, вам нужно сделать что-то вроде этого:

while($nodeInQuestion->nodeType != 1 && $nodeInQuestion->nextSibling) {
    $nodeInQuestion = $nodeInQuestion->nextSibling;
}

Это своего рода псевдокод. Очевидно, вам нужно как-то обработать сбой, если вы ищете элемент и достигнете конца childNodes parentNode, прежде чем найдете его.

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