PHPInside #1 Статья: Чтение XML с использованием DOM

D.N.S

Новичок
PHPInside #1 Статья: Чтение XML с использованием DOM

music.xml
Код:
[size=2][FONT=courier new]<music>
    <artist id="1">
        <name>The Rolling Stones</name>
        <albums>
            <title>Exile On Main Street</title>
        </albums>
    </artist>
    <artist id="2">
        <name>Aimee Mann</name>
        <albums>
            <title>I'm With Stupid</title>
            <title>Bachelor No. 2</title>
        </albums>
    </artist>
</music>[/FONT][/size]
music.php
Код:
[PHP]<?php
$music = new domDocument;
$music->preserveWhiteSpace = false;
$music->load('music.xml');
$artists = $music->documentElement;
print "<table>\n";
foreach ($artists->childNodes as $artist) {
    $names =$artist->getElementsByTagName('name');
    $name = $names->item(0)->firstChild->nodeValue;
    $titles =$artist->getElementsByTagName('title');
    foreach ($titles as $title) {
        print "<tr><td>$name</td>";
        print "<td>" . $title->firstChild->nodeValue . "</td></tr>\n";
    }
}
print "</table>\n";
?>[/PHP]
Почему не работает этот код? =(
Ошибка: Fatal error: Call to undefined method DOMText::getElementsByTagName() in music.php on line 8
 

Profic

just Profic (PHP5 BetaTeam)
Версия php и libxml?
В music.php точно есть:
PHP:
$music->preserveWhiteSpace = false;
?
У меня этот код работает на ура. Если закомментировать преведенную выше строку, то получу именно такое сообщение, что вобщем-то понятно.
Скорее всего в реальном скрипте неверный регистр в preserveWhiteSpace.
 

D.N.S

Новичок
PHP Version => 5.0.5
libXML Version => 2.6.11

Все равно не работает.

А вот простенький примерчик работает:
PHP:
$names = $music->getElementsByTagName('name');
foreach ($names as $name) {
    print $name->firstChild->nodeValue . "\n";
}
В чем может быть проблема?

В статье написано, что пакет libxml2 включен в PHP5, означает ли это, что файл libxml2.dll должен лежать в ext? Его там у меня нет. Я скачал 2.6.19, кинул в ext, прописал в php.ini, так он у меня запросил iconv.dll, и его я закачал вместе с php_iconv.dll. Ошибок стало еще больше и опять просит еще новый файл... =((

Вобщем что нужно для того, чтобы все работало?! =)
 

Profic

just Profic (PHP5 BetaTeam)
Ничего. Все встроенно. И что либо испортить нельзя.
Либо приводишь реальный скрипт, который не работает и реальный xml, либо сам идешь телепатить и танцевать с бубном.

В чем скорее всего проблема явно расписано в моем первом сообщении. Т.е. между тегов получаются еще и пустые текстовые ноды.
 

crocodile2u

http://vbolshov.org.ru
D.N.S
Послушай совет Profic.
Он ведь даже строку указал, в которой проблема (или которой в _твоем реальном_ коде просто нет)
 

_CMD_

Новичок
А поскожите по какой причине метод getElementsByTagName() выдает только 1 ноду вместо, имеющихся 3х ?
 

crocodile2u

http://vbolshov.org.ru
_CMD_
Думается, причина такова: там, где ты ищешь, искомая нода все-таки одна.

какой getElementsByTagName() имеется в виду: DOMDocument->getElementsByTagName() или DOMElement->getElementsByTagName()?

Попробую догадаться: наверное, DOMElement...
 

_CMD_

Новичок
Опять сам разобраля.. росто ступил с DomNodeList'ом работал как с обычным массивом этом то и была проблема +)..
 
Сверху