PHP DOMDocument: как анализировать xml / rss теги с именами полей CUSTOM?

У меня ниже RSS для синтаксического анализа, например:

<?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> <x-trumba:customfield name="description">This is the description about apples</xCal:customfield> <x-trumba:customfield name="category">Fruits,Food,Apple</xCal:customfield> </item> <item> <title>About Oranges</title> <author>Marry L. Jones</title> <x-trumba:customfield name="description">This is the description about oranges</xCal:customfield> <x-trumba:customfield name="category">Fruits,Food,Orange</xCal:customfield> </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, } 

Но вот эти проблемы :

 <x-trumba:customfield name="description">This is the description about apples</xCal:customfield> <x-trumba:customfield name="category">Fruits,Food,Apple</xCal:customfield> 

Пожалуйста помоги:

  • Как анализировать последние узлы, такие как <x-trumba:customfield name="description"> ?

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

Пожалуйста, любезно помогите.

Ваш XML недопустим, префикс «x-trumba» не определен, а закрывающие теги элементов используют префикс «xCal», ссылаясь на urn:ietf:params:xml:ns:xcal .

Поэтому замена префикса открывающих тегов на «xCal» и фиксация закрывающих тегов для «author» делает XML действительным.

Затем можно зарегистрировать пространство имен xCalendar и использовать Xpath для получения настраиваемого содержимого поля:

 $rss = new DOMDocument(); $rss->load( "http://www.example.com/books.rss" ); $xpath = new DOMXpath($rss); $xpath->registerNamespace('x', 'urn:ietf:params:xml:ns:xcal'); foreach( $xpath->evaluate("//item") as $item ) { echo $xpath->evaluate('string(title)', $item), "\n"; echo $xpath->evaluate('string(x:customfield[@name="description"])', $item), "\n"; } 

Вывод:

 About Apples This is the description about apples About Oranges This is the description about oranges 

Выражение Xpath использует условие ( [@name="description"] ) для фильтрации узлов пользовательского customfield .