PHP DOMDocument: Как анализировать имена пользовательских тегов XML / RSS с помощью COLONS?

У меня есть ниже 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>
<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
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
1

По вопросам рекламы [email protected]