我必须在这里遗漏一些东西,但我无法弄明白。
我使用SimpleXML来解析RSS和ATOM提要,但问题是,使用相同的xpath方法,我无法在使用RSS提要时从ATOM提要中选择<link>
。
来自两个Feed的样本
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
>
<channel>
<title>比特客栈的文艺复兴</title>
<atom:link href="http://bitinn.net/feed/" rel="self" type="application/rss+xml" />
<link>http://bitinn.net</link>
<description>We don't choose who we are, but we do choose who we become.</description>
<lastBuildDate>Sun, 27 Apr 2014 14:43:22 +0000</lastBuildDate>
<language>en-US</language>
<sy:updatePeriod>hourly</sy:updatePeriod>
...
<?xml version="1.0" encoding="UTF-8"?>
<feed
xmlns="http://www.w3.org/2005/Atom"
xmlns:thr="http://purl.org/syndication/thread/1.0" xml:lang="en-US" xml:base="http://bitinn.net/wp-atom.php">
<title type="text">比特客栈的文艺复兴</title>
<subtitle type="text">We don't choose who we are, but we do choose who we become.</subtitle>
<updated>2014-04-27T14:43:22Z</updated>
<link rel="alternate" type="text/html" href="http://bitinn.net"/>
<id>http://bitinn.net/feed/atom/</id>
<link rel="self" type="application/atom+xml" href="http://bitinn.net/feed/atom/"/>
<generator uri="http://wordpress.org/" version="3.9">WordPress</generator>
<link rel="hub" href="http://pubsubhubbub.appspot.com"/>
<link rel="hub" href="http://superfeedr.com/hubbub"/>
<entry>
<author>
<name>店长</name>
<uri>http://bitinn.net/</uri>
</author>
...
似乎$xml->channel->xpath('atom:link[@rel="self"]');
适用于RSS Feed,但$xml->xpath('link[@rel="self"]');
不适用于ATOM Feed。我怀疑我在第二个查询中搞乱了命名空间,但没找到正确的xpath查询。
有人有想法吗?
答案 0 :(得分:2)
在第二种情况下,默认xmlns
设置在feed
根元素,即
<feed xmlns="http://www.w3.org/2005/Atom" ...
表示Feed和嵌套元素现在位于http://www.w3.org/2005/Atom
。您需要调整xpath以适应这种情况。
xpath将是
atom:feed/atom:link[@rel="self"]
xmlns:atom = 'http://www.w3.org/2005/Atom'
答案 1 :(得分:1)
由于XPath 1.0规范不支持默认命名空间(并且由于PHP SimpleXML使用libxml,据我所知,它实现了1.0规范),我们需要首先注册默认命名空间以使xpath正常工作。 / p>
首先$xml->registerXPathNamespace('atom', 'http://www.w3.org/2005/Atom')
,然后我们可以成功$xml->xpath('atom:link[@rel="self"]');
。