2013-07-03 4 views
0

Я хочу прочитать вложенные элементы и значения атрибутов каждого элемента из файла XML. Я использую SimpleXML и вот мой код до сих пор:Проанализировать данные simpleXML рекурсивно с помощью PHP

$path = Mage::getBaseUrl('media').'Banners/data.xml' ; 
$doc = new DOMDocument(); 
$doc->load($path); 

$items = $doc->getElementsByTagName("imgitem"); 
$xml=simplexml_load_file($path); 

foreach($xml->children() as $child) 
{ 
    foreach($child as $item) 
    { 
     $attr = $xml->imgitem->attributes(); 
     echo $attr['image'].'<br>'; 
     echo $attr['link'].'<br>'; 
     echo $attr['target'].'<br>';    

    } 
} 

Может кто-нибудь мне точку в правильном направлении, чтобы получить все дочерние узлы и их атрибуты рекурсивно?

Вот исходный XML-файл структура

<Banner> 
<imgitem image="img/source/path" link="" target="_blank" delay="" textBlend="yes"> <![CDATA[Autumn Leaves]]> </imgitem> 
<imgitem image="img/source/path" link="" target="_blank" delay="" textBlend="yes"> <![CDATA[Creek]]> </imgitem> 
<imgitem image="img/source/path" link="" target="_blank" delay="" textBlend="yes"> <![CDATA[Dock]]> </imgitem> 
</Banner> 

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

+0

Вы, кажется, есть некоторый DOM-код в там, который не делает ничего - возможно, оставшийся от предыдущей попытки? Кроме того, не совсем ясно, где рекурсия будет соответствовать указанному коду, который вы показываете; мы можем увидеть образец XML, который вы пытаетесь обработать, и желаемый результат? – IMSoP

ответ

1

Спасибо, что уяснил вопрос. Я думаю, вы здесь слишком усложняете - здесь нет рекурсии, и вам может понадобиться не более одного цикла.

У вас уже есть foreach($xml->children() as $child) - это даст вам каждый <imgitem> в свою очередь, как $child, так как они являются детьми элемента верхнего уровня. Вы могли бы эквивалентно сказать foreach($xml->imgitem as $child), который пропустит любые дети, которые не являются <imgitem> тегами.

Повторяя атрибуты этих элементов, вам просто нужно сказать $child['someAttributeName'] - так что ваш код, как у вас в примере просто выглядеть следующим образом:

$path = Mage::getBaseUrl('media').'Banners/data.xml' ; 
$xml = simplexml_load_file($path); 

foreach($xml->children() as $child) 
{ 
    echo $child['image'].'<br>'; 
    echo $child['link'].'<br>'; 
    echo $child['target'].'<br>';   
} 

Если вместо ссылок конкретные атрибуты, для некоторых причина хочет цикл по каждому атрибуту, в свою очередь, нужно просто еще один цикл внутри:

foreach($xml->children() as $child) 
{ 
    foreach($child->attributes() as $attr_name => $attr_value) 
    { 
     echo "Attribute '$attr_name' has value '$attr_value'"; 
    } 
} 
1

искал аналогичное решение для нахождения всех дочерних узлов рекурсивны до бесконечности в большом XML-документе. Это работает для меня:

$xmlIterator = new RecursiveIteratorIterator() 
new SimpleXMLIterator($xml_string), 
RecursiveIteratorIterator::SELF_FIRST); 
foreach ($xmlIterator as $nodeName => $node) { 
    echo "<br>" . $nodeName, $node['attribute'], PHP_EOL; 
} 
+0

кажется сломанным для меня – Tristanisginger

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