2012-06-04 4 views
0

Я пытаюсь прочитать некоторые RSS-каналы с DOM в PHP, как это:Выберите узлы без пространства имен/префикса в PHP DOM?

<channel> 
     <atom:link href='' rel='self' type='application/rss+xml' /> 
     <title>TechStuff</title> 
     <link>http://www.howstuffworks.com</link> 

Чтобы захватить ссылку (<link></link>) я использую этот кусок кода:

$doc->getElementsByTagName('link')->item(0); 

Он работает в все другие RSS-каналы, которые я пробовал. Но этот разместил <atom:link> до <link>, а это значит, что вместо этого он берет <atom:link>.

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

ответ

0

Вы можете сказать, есть ли узел пространства имен, проверяя ->prefix или ->namespaceURI:

foreach ($doc->getElementsByTagName('link') as $link) { 
    if (strlen($link->prefix)) { 
     continue; 
    } 
    // $link does not have prefix 
} 
1

Умение решить эту проблему, используя DOMXPath и XPath syntax.

+0

Было бы неплохо, если бы вы добавили небольшой пример, как (просто образцовый xpath, имена xpath-функции должны тогда говорить сами за себя) – hakre

1

Вот DOMXPath пример:

$xpath = new DOMXpath($doc); 
$linkPath = $xpath->query("/rss/channel/link"); 
$link = $linkPath->item(0)->nodeValue; 

На подобной иерархии XML, он работал для меня.

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