<?xml version="1.0" encoding="utf-8" ?> <items> <aaa> </aaa> <aaa> </aaa> <aaa> <bbb> </bbb> <bbb> </bbb> <bbb> <ccc> Only this childnod what I need </ccc> <ccc> And this one </ccc> </bbb> </aaa> </items>
Я хочу разобрать XML, как указано выше, с PHP. Я не знаю, как получить эти два дочерних узла.
Когда я использую приведенный ниже код, он вызывает ошибку: Warning: main() [function.main]: Cannot add element bbb number 2 when only 0 such elements exist in
<?php header('Content-type:text/html; charset=utf-8'); $xml = simplexml_load_file('2.xml'); foreach ($xml->aaa[2]->bbb as $bbb){ echo $bbb[2]->$ccc; // wrong in here echo $bbb[3]->$ccc; } ?>
Я не знаю, как использовать возврат simplexml, но из того, что я видел из вашего кода, это должно работать:
<?php header('Content-type:text/html; charset=utf-8'); $xml = simplexml_load_file('2.xml'); echo $xml->aaa[2]->bbb[2]->ccc[0]; echo $xml->aaa[2]->bbb[2]->ccc[1]; ?>
Использовать xpath
$ccc = $xml->xpath('aaa/bbb/ccc'); foreach($ccc as $c){ echo (string)$c."<br/>"; }
Результат:
Only this childnod what I need And this one
Кроме того, в вашей первоначальной попытке $bbb[3]
не имеет смысла, потому что у вас есть только три элемента, начиная с индекса 0.
Более динамичное решение
<?php header('Content-type:text/html; charset=utf-8'); $xml = simplexml_load_file('2.xml'); foreach ($xml->aaa as $aaa){ if ($aaa->bbb) { foreach ($aaa->bbb as $bbb) { if ($bbb->ccc) foreach ($bbb->ccc as $ccc) { echo $ccc; } } } } } ?>