PHP DOMDocument:如何使用COLONS解析自定义XML / RSS标记名称?

时间:2016-06-29 09:14:51

标签: php xml rss domdocument conditional-operator

我要解析下面的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,
}

我可以在那里阅读之外的所有内容{/ 1}}。 (节点名称完全相同:xCal:descriptiondescription。)

  1. 如何解析(读取) xCal:description
  2. 等节点
  3. 是否因为类似的节点名称,例如:xCal:descriptiondescription
  4. (我无法更改RSS来源,因为它不受我的控制。)

    请帮助。

2 个答案:

答案 0 :(得分:1)

使用getElementsByTagNameNS()

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

答案 1 :(得分: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