У меня есть ниже 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
.)
xCal:description
description
и xCal:description
?(Я не могу изменить источник RSS, так как он не находится под моим контролем.)
Пожалуйста, помогите.
использование getElementsByTagNameNS ():
$node->getElementsByTagNameNS("urn:ietf:params:xml:ns:xcal", "description")->item(0)->nodeValue
Хотя использование вариантов 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