rss Xml命名空间混乱

时间:2009-12-29 21:30:09

标签: php xml

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/"  xmlns:jskit="http://purl.org/dc/elements/1.1/" >
    <channel>
        <title>www.domain.com/page_735.htm comments</title>
        <link>http://www.domain.com/page_735.html</link>
        <atom:link rel="self" type="application/rss+xml" href="http://js-kit.com/rss/domain.com/page_735.html"></atom:link>
        <jskit:attribute key="md5path" value="eb7110ce84f5907c29f0717c171ad35e"></jskit:attribute>
        <jskit:attribute key="path" value="/page_735.html"></jskit:attribute>
        <description>RSS comments feed for www.domain.com/page_735.html</description>
        <generator>JS-Kit Bulk Site Exporter 0.8</generator>
        <lastBuildDate>Mon, 09 Nov 2009 10:35:47 +0000</lastBuildDate>
        <item>
            <guid>jsid-1259747304-188</guid>
            <pubDate>Wed, 02 Dec 2009 09:48:24 +0000</pubDate>
            <jskit:attribute key="IP" value="59.182.xxx.xxx"></jskit:attribute>
            <jskit:attribute key="permalink" value="http://www.domain.com/page_735.html"></jskit:attribute>
            <author>guest</author>
            <jskit:attribute key="share_facebook" value="off"></jskit:attribute>
            <jskit:attribute key="share_gfc" value="off"></jskit:attribute>
            <jskit:attribute key="share_twitter" value="off"></jskit:attribute>
            <jskit:attribute key="share_friendfeed" value="off"></jskit:attribute>
            <jskit:attribute key="share_yahoo" value="off"></jskit:attribute>
            <jskit:attribute key="Webpresence" value="[]"></jskit:attribute>
            <description>im a disco dancer</description>
            <jskit:parent-guid>jsid-1250154466-622</jskit:parent-guid>
        </item>
    </channel>
</rss>

我知道一点xml,但这超出了我的想象:(

如何提取固定链接或IP或父导管的值

我只能提取guid,pubdate,作者和描述

我无法找出命名空间

2 个答案:

答案 0 :(得分:0)

如果您使用名称空间不知道的解析器,那么您将只有一些带有冒号的元素名称。如果使用名称空间感知解析器,则必须在告诉API要查找的元素时指定冒号后面的部分以及为前缀部分定义的URI。

e.g。 jskit:attribute - &gt;名为“http://purl.org/dc/elements/1.1/”的命名空间中名为“attribute”的元素。

答案 1 :(得分:0)

您必须使用XPath来查找正确的节点,然后从中获取值。 xpath()总是返回一个数组,所以你必须编写一个只返回该数组的第一个元素的小函数。

要访问命名空间元素,您可以使用XPath表达式或SimpleXML的children() method。因为“parent-guid”包含连字符,所以它使得写入属性的名称有点尴尬。

这是一个有效的例子:

function attr(SimpleXMLElement $item, $key)
{
    $values = $item->xpath('./jskit:attribute[@key="' . $key . '"]/@value');
    return $values[0];
}

$rss = simplexml_load_string($xml);

foreach ($rss->channel->item as $item)
{
    $permalink   = attr($item, 'permalink');

    // either
    $parent_guid = $item->children('http://purl.org/dc/elements/1.1/')->{'parent-guid'};

    // or (PHP 5.2)
    $parent_guid = $item->children('jskit', true)->{'parent-guid'};

    // or
    $parent_guid = $item->xpath('./jskit:parent-guid');
    $parent_guid = $parent_guid[0];
}