Php 无法使用xpath选择元素

Php 无法使用xpath选择元素,php,xml,xpath,rss,atom-feed,Php,Xml,Xpath,Rss,Atom Feed,我一定是遗漏了什么,但我想不出来 我使用SimpleXML解析RSS和ATOM提要,但问题是,使用相同的xpath方法,在ATOM提要处理RSS提要时,我无法从中进行选择 两种饲料的样品 <?xml version="1.0" encoding="UTF-8"?> <rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellfo

我一定是遗漏了什么,但我想不出来

我使用SimpleXML解析RSS和ATOM提要,但问题是,使用相同的xpath方法,在ATOM提要处理RSS提要时,我无法从中进行选择

两种饲料的样品

<?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&#039;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源,但$xml->xpath'link[@rel=self];不适用于ATOM提要。我怀疑我在第二个查询中弄乱了名称空间,但没有找到正确的xpath查询


有人有想法吗?

在第二种情况下,在提要根元素处设置了一个默认的xmlns,即

<feed xmlns="http://www.w3.org/2005/Atom"  ...

其中xmlns:atom=http://www.w3.org/2005/Atom“

由于XPath 1.0规范不支持默认名称空间,而且据我所知,PHP SimpleXML使用libxml实现1.0规范,因此我们需要首先注册默认名称空间,XPath才能正常工作


所以$xml->registerXPathNamespace'atom','http://www.w3.org/2005/Atom'首先,我们可以执行$xml->xpath'atom:link[@rel=self]';成功。

这是有道理的,但我想知道为什么不受这个默认名称空间的影响,例如,$xml->xpath'title'似乎与ATOM提要一起工作。如果您真的陷入困境,您还可以使用诸如->xpath'*[local name=link和@rel=self]之类的名称空间不可知功能。请不要这样做,它看起来很可怕。请改用通配符运算符以避免使用名称空间,即.*:link。顺便说一句,您的元素肯定位于atom命名空间中,因此,如果您真的完全不使用命名空间访问它,那么返回title元素是实现中的一个错误。与CSS不同,Xpath 1.0中没有默认命名空间。您必须始终注册自己的前缀。PHP有一个bug并注册当前上下文的名称空间前缀。不要依赖于自动名称空间注册。只需为Xpath表达式注册自己的前缀即可。@dirkk@thh-thx以清除这些前缀。将$xml->title与$xml->xpath'title'混淆是我的错误;在注册atom名称空间后,它确实需要$xml->xpath'atom:title'来正确查询
atom:feed/atom:link[@rel="self"]