У меня ниже 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
.