2014-10-14 10 views
0

Так что я пытаюсь итерацию через DOM-документ, который будет выглядеть следующим образом:PHP Дочерние узлы

<track rank="1"> 
    <name>Believe</name> 
    <duration>239</duration> 
    <mbid>13194c93-89c6-4ab4-aaf2-15db5d73b74e</mbid> 
    <url>http://www.last.fm/music/Cher/_/Believe</url> 
    <streamable fulltrack="0">0</streamable> 
    <artist> 
     <name>Cher</name> 
     <mbid>bfcc6d75-a6a5-4bc6-8282-47aec8531818</mbid> 
     <url>http://www.last.fm/music/Cher</url> 
    </artist> 
</track> 

Использование PHP я могу просто сделать $tracks = $xml->getElementsByTagName("track"); И дело в том, для каждого трека я хочу, чтобы получить как его название, так и продолжительность. Мне известно о свойстве childNodes, но я не хочу их зацикливать. Есть ли способ получить к ним доступ напрямую, не используя foreach для своих детей?

+1

Вы рассматривали SimpleXML для этого? Это было бы так же просто, как '$ track_names = $ xml-xpath ('// track/name'); $ durations = $ xml-> xpath ('// track/duration'); ' –

+0

Это не работает, так как я создаю новый SimpleXMLElement. И для каждого существующего трека мне нужно знать их ценности, поэтому я думаю, что ваш путь не работает для меня. –

+0

Где проблема при создании нового элемента SimpleXMLElement из двух массивов? – andy

ответ

0
<?php 

$doc = new DOMDocument; 
$doc->load('example.xml'); 

$xpath = new DOMXPath($doc); 

$tracks = array(); 

foreach ($xpath->query('//track') as $track) { 
    $tracks[] = array(
    'name' => $xpath->evaluate('string(name)', $track), 
    'duration' => $xpath->evaluate('number(duration)', $track), 
); 
} 

print_r($tracks); 
Смежные вопросы