2016-10-17 5 views
1

Я уже читал эти темы: PHP library for parsing XML with a colons in tag names? и Simple XML - Dealing With Colons In Nodes, но i coundt реализует эти решения.Чтение значений тегов тэгов XML PHP

<item> 
<title> TITLE </title> 
<itunes:author> AUTHOR </itunes:author> 
<description> TEST </description> 
<itunes:subtitle> TEST </itunes:subtitle> 
<itunes:summary> TEST </itunes:summary> 
<itunes:image href="yoyoyoyo.jpg"/> 
<pubDate> YESTERDAY </pubDate> 
<itunes:block>no</itunes:block> 
<itunes:explicit>no</itunes:explicit> 
<itunes:duration>99:99:99</itunes:duration> 
<itunes:keywords>key, words</itunes:keywords> 
</item> 

Я хочу получить только itunes: продолжительность и itunes: изображение. Вот мой код:

$result = simplexml_load_file("http://blablabla.com/feed.xml"); 

$items = $result->xpath("//item"); 

foreach ($items as $item) { 

    echo $item->title; 
    echo $item->pubDate; 
} 

Я попытался с помощью children() метод, но когда я пытаюсь print_r это не говорит о том, что узел больше не существует.

+1

Согласно w3c правил [квалифицированные имена] (http://www.w3.org/TR/1999/REC-xml-names-19990114/#ns-qualnames) , префикс пространства имен должен быть определен в корне или элементе предка. Если ваш пост не является фрагментом, нет, где в вашем XML есть пространство имен 'itunes', такое как:' xmlns: itunes = "http://www.apple.com" '. – Parfait

+0

Это не мой XML, его с сайта, где я планирую его обходить. =) – Adrian

ответ

2

Вы должны использовать children() на $item элемента, чтобы получить его дочерние-элементы:

$str =<<< END 
<item> 
<title> TITLE </title> 
<itunes:author> AUTHOR </itunes:author> 
<description> TEST </description> 
<itunes:subtitle> TEST </itunes:subtitle> 
<itunes:summary> TEST </itunes:summary> 
<itunes:image href="yoyoyoyo.jpg"/> 
<pubDate> YESTERDAY </pubDate> 
<itunes:block>no</itunes:block> 
<itunes:explicit>no</itunes:explicit> 
<itunes:duration>99:99:99</itunes:duration> 
<itunes:keywords>key, words</itunes:keywords> 
</item> 
END; 

$result = @simplexml_load_string($str); 

$items = $result->xpath("//item"); 

foreach ($items as $item) { 
    echo $item->title . "\n"; 
    echo $item->pubDate . "\n"; 
    echo $item->children()->{'itunes:duration'} . "\n"; 
} 

Выход:

TITLE 
YESTERDAY 
99:99:99 
+0

Я вижу. Большое спасибо Dekel. Я должен больше узнать о xpath, так как я не смог найти его нигде. – Adrian

+0

Жаль исправлять, но я проверил ваш код (и мой после изменения), и никто из них не работал. 99:99:99 тоже не показывался на вашем коде, и я копировал его. – Adrian

+0

Хорошо, я заработал, используя вместо этого $ item-> children() -> duration. Я не знаю, почему он принимает продолжительность, но не itunes: продолжительность. Когда я сделал print_r на $ item, он показал элемент как «продолжительность» вместо ïtunes: duration » – Adrian

0

Вот идет моя альтернативное решение, если не работают Dekel для кого-то.

С помощью метода getNamespaces

$result = simplexml_load_file("http://blablabla.com/feed.xml"); 

$items = $result->xpath("//item"); 

foreach ($items as $item) 
{ 

    $itunesSpace = $item->getNameSpaces(true); 
    $nodes = $item->children($itunesSpace['itunes']); 

    //TEST 
    echo $nodes->subtitle 

    //99:99:99 
    echo $nodes->duration 

    //If you want the image Href 

    $imageAux = $nodes->image->attributes(); 
    //yoyoyoyo.jpg 
    echo $imageAux['href']; 
} 
Смежные вопросы