2014-11-29 2 views
1

Я смотрел на другие вопросы, размещенные здесь на эту тему, но все они, как представляется, имеют общий «симметричный» xml-файл.SimpleXml и php Итерация

Я начинаю по телефону:

$xml_testimonials=simplexml_load_file("bck/testimonials.xml"); 

Я не могу повторять этот файл:

<?xml version="1.0" encoding="utf-8"?> 

<testimonials> 

<description><![CDATA[ 
<p>Give us your feeback!</p> 
]]></description> 

<testimonials_collection> 

<testimonial> 
<testimonial_name> 
Dummy Name 
</testimonial_name> 
<testimonial_content> 
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed nec libero venenatis, posuere massa  vitae, volutpat massa. Maecenas placerat ac metus ut pulvinar. 
</testimonial_content> 
</testimonial> 

<testimonial> 
<testimonial_name> 
Dummy Name 
</testimonial_name> 
<testimonial_content> 
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed nec libero venenatis, posuere massa  vitae, volutpat massa. Maecenas placerat ac metus ut pulvinar. 
</testimonial_content> 
</testimonial> 

<testimonial> 
<testimonial_name> 
Dummy Name 
</testimonial_name> 
<testimonial_content> 
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed nec libero venenatis, posuere massa vitae, volutpat massa. Maecenas placerat ac metus ut pulvinar. 
</testimonial_content> 
</testimonial> 

</testimonials_collection> 

</testimonials> 

Im пытается использовать:

foreach($xml_testimonials->testimonials->testimonials_collection as $testimonial) { 
    print $testimonial->testimonial->testimonial_name; 
} 

и Im получая

Warning: Invalid argument supplied for foreach() 

Также есть все, что я могу избежать использовать и сохранить теги html?

ответ

1

Ваш XML правильно загружает и анализирует, однако при использовании SimpleXML корневой узел XML-документа не представлен в результирующей структуре объекта. Это означает, что вместо того, чтобы начать обход с <testimonials> (корневым узлом здесь), самый высокий уровень для доступа - это фактически <testimonials_collection>.

Таким образом, ваш цикл должен выглядеть на самом деле:

// Iterate <testimonial> nodes beneath <testimonials_collection> 
foreach($xml_testimonials->testimonials_collection->testimonial as $testimonial) { 
    // And get internal details of each <testimonial> node... 
    echo $testimonial->testimonial_name; 
} 

Вот демонстрация, получение Dummy Name из 3 узлов: http://codepad.viper-7.com/rQZwOJ

+0

Спасибо вам, кроме того, правильный ответ вы объяснение очень ясно и с пример. Что касается тега CDATA, есть ли у него шанс не иметь этого? – Marvin

+1

@Marvin Добро пожаловать, и я надеюсь, что вы всегда получите хорошие объяснения вместе с ответами, которые люди предоставляют вам здесь. Спросите их, если вы их не получите, потому что вы их заслуживаете, как и будущие читатели сайта. –

+0

Привет, благодарю вас за то, что вы вернулись ко мне по этому вопросу, я имел в виду, что если CDATA всегда должен использоваться, если я хочу использовать теги html внутри моего xml. – Marvin