2008-10-11 2 views
1

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

<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; 

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

ответ

1

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

+0

Думаю, я понимаю, что происходит сейчас. благодаря –

1

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

<?php 
$xmldoc = new DOMDocument(); 
$xmldoc->load('file.xml', LIBXML_NOBLANKS); 
?> 
0

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

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

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

1

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

Смежные вопросы