2016-06-29 2 views
1

У меня есть ниже RSS, чтобы разобрать, что-то вроде:PHP DOMDocument: как анализировать пользовательские имена тегов XML/RSS с помощью COLONS?

<?xml version="1.0" encoding="utf-8"?> 
<rss xmlns:x-wr="http://www.w3.org/2002/12/cal/prod/Apple_Comp_628d9d8459c556fa#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:x-example="http://www.example.com/rss/x-example" xmlns:x-microsoft="http://schemas.microsoft.com/x-microsoft" xmlns:xCal="urn:ietf:params:xml:ns:xcal" version="2.0"> 
    <channel> 
     <item> 
      <title>About Apples</title> 
      <author>David K. Lowie</title> 
      <description>Some description about apples</description> 
      <xCal:description>This is the full description about apples</xCal:description> 
     </item> 
     <item> 
      <title>About Oranges</title> 
      <author>Marry L. Jones</title> 
      <description>Some description about oranges</description> 
      <xCal:description>This is the full description about oranges</xCal:description> 
     </item> 
    </channel> 
</rss> 

В PHP, я разобрать это что-то вроде:

$rss = new DOMDocument(); 
$rss->load("http://www.example.com/books.rss"); 

foreach($rss->getElementsByTagName("item") as $node) { 
    echo $node->getElementsByTagName("title")->item(0)->nodeValue, 
    echo $node->getElementsByTagName("author")->item(0)->nodeValue, 
    echo $node->getElementsByTagName("description")->item(0)->nodeValue, 
    echo $node->getElementsByTagName("xCal:description")->item(0)->nodeValue, 
} 

Я могу читать все, кромеxCal:description узел там. (Имена узлов точно так:. description и xCal:description)

  1. Как разобрать (прочитать) узлы, какxCal:description
  2. Является ли это из-за подобных имен узлов, как: description а xCal:description?

(я не могу изменить RSS источник, поскольку он не находится под моим контролем.)

Просьба помочь.

ответ

1

Использование getElementsByTagNameNS():

$node->getElementsByTagNameNS("urn:ietf:params:xml:ns:xcal", "description")->item(0)->nodeValue 
+0

OMG это работает как шарм !!! Огромное спасибо!!! Да благословит тебя Бог!!! –

+1

@ 夏 期 劇場 'echo $ node-> getElementsByTagNameNS ($ node-> lookupNamespaceURI ('xCal')," description ") -> item (0) -> nodeValue;' – splash58

+0

Привет 'code-kobold' и' splash58', спасибо как за помощь. Можете ли вы, ребята, помочь мне в этом тоже, пожалуйста: http://stackoverflow.com/questions/38096183/php-domdocument-how-to-parse-xml-rss-with-custom-tag-names (Спасибо всем) –

1

При использовании имен осведомленные варианты методов DOM является правильным ответом, вы можете захотеть взглянуть на Xpath. Это гораздо более удобный способ получить данные из DOM.

Для выражения Xpath вы можете зарегистрировать собственные префиксы для пространств имен по мере необходимости.

$rss = new DOMDocument(); 
$rss->load("http://www.example.com/books.rss"); 
$xpath = new DOMXpath($rss); 
$xpath->registerNamespace('xc', 'urn:ietf:params:xml:ns:xcal'); 

foreach($xpath->evaluate("//item") as $item) { 
    echo $xpath->evaluate('string(title)', $item), "\n"; 
    echo $xpath->evaluate('string(author)', $item), "\n"; 
    echo $xpath->evaluate('string(description)', $item), "\n"; 
    echo $xpath->evaluate('string(xc:description)', $item), "\n"; 
} 

Выход:

About Apples 
David K. Lowie 
Some description about apples 
This is the full description about apples 
About Oranges 
Marry L. Jones 
Some description about oranges 
This is the full description about oranges 
+0

Большое спасибо. Это довольно аккуратно. Не могли бы вы также помочь по другому вопросу здесь: http://stackoverflow.com/questions/38096183/php-domdocument-how-to-parse-xml-rss-with-custom-tag-names, пожалуйста? :) –

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