Определить количество детей и как взять текстовое значение

auditseo

Новичок
Есть XML http://www.w3schools.com/php/cd_catalog.xml
PHP:
<?php
$q = $_GET["q"];
$xmlDom = new DOMDocument();
$xmlDom->load("list_cd.xml");
echo $xmlDom->documentElement->childNodes->length;
Почему вызов размера возвращает 55 детей, ведь записей CD всего 27 шт + 1 ребенок на #text

Я хочу пройтись по всем CD и у каждого TITLE вывести текст. Как я это понимаю, последовательно обращаюсь к каждому CD, у него беру список всех детей и обращаюсь к первому ребенку и уже у него вызываю первого ребенка, то есть тело тега.

PHP:
<?php
//receive answer
$q = $_GET["q"];
echo "Вызов пришел! ";
$xmlDom = new DOMDocument();
$xmlDom->load("list_cd.xml");
$model = $xmlDom->documentElement;
for($i = 1; $i < $model->childNodes->length; $i++){
echo $model->childNodes->item(i)->childNodes->item(1)->childNodes->item(0)->nodeValue . "<br>";
}
Как бы все просто, но у меня ничего не выходит... Прошу помощи.
 

AnrDaemon

Продвинутый новичок
Начни отлаживать свой код.
Попробуй распечатать ноды на каждой итерации.
 

auditseo

Новичок
Начни отлаживать свой код.
Попробуй распечатать ноды на каждой итерации.
Я этим занимаюсь, но безбезультатно.
Правильно я понимаю, чтобы получить текст, который в теге, нужно запросить сам тег, а у него первого ребенка и у ребенка nodeValue?
 

auditseo

Новичок
Как бы мои слова подтверждаются:

The JavaScript code to get the text from the first <title> element in books.xml:

txt=xmlDoc.getElementsByTagName("title")[0].childNodes[0].nodeValue

After the execution of the statement, txt will hold the value "Everyday Italian"

Explained:

  • xmlDoc - the XML DOM object created by the parser.
  • getElementsByTagName("title")[0] - the first <title> element
  • childNodes[0] - the first child of the <title> element (the text node)
  • nodeValue - the value of the node (the text itself)
Но все равно не пойму откуда число 55, если CATALOG имеет 27 CD и 1 пустой текстовый нод. ???
 

auditseo

Новичок
Потестил
PHP:
echo $model->childNodes->length . "<br>";
for($i = 0; $i < $model->childNodes->length; $i++){
    echo $model->childNodes->item($i)->nodeType . " ";
}
У нас чередуется DOMElement и DOMText, и я не понимаю почему DOMText получается 27 штук? у CATALOG ведь должен быть один ребенок DOMText?
 

WMix

герр M:)ller
Партнер клуба
а ты в курсе что пробелы и табуляторы между элементами тоже считаются?
55 = 27 + 27 + 1

PHP:
foreach( $model->childNodes as $node){
    echo $node->nodeType . " ";
}
 
Последнее редактирование:

auditseo

Новичок
а ты в курсе что пробелы и табуляторы между элементами тоже считаются?
55 = 27 + 27 + 1
ахаахха, точно...да...уж...
In the example above you see that there are empty text nodes between each element.

When XML generates, it often contains white-spaces between the nodes. The XML DOM parser treats these as ordinary elements, and if you are not aware of them, they sometimes cause problems.
получается лучший выход это использовать метод nodeType, чтобы он равнялся 1-це.
 
Сверху