php – XPath过滤属性与命名空间

前端之家收集整理的这篇文章主要介绍了php – XPath过滤属性与命名空间前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要创建XPath表达式,以根据给定的命名空间中的属性进行过滤.示例 XML是:
<Feed xmlns='http://www.w3.org/2005/Atom' xmlns:media='http://search.yahoo.com/mRSS/'
  xmlns:yt='http://gdata.youtube.com/schemas/2007'> ...
 <entry>
  <media:group>
   <media:thumbnail url='http://i.ytimg.com/1.jpg' yt:name='default'/>
   <media:thumbnail url='http://i.ytimg.com/2.jpg' yt:name='hqdefault'/>
   <media:thumbnail url='http://i.ytimg.com/3.jpg' yt:name='start'/>
   <media:thumbnail url='http://i.ytimg.com/4.jpg' yt:name='middle'/>
  </media:group>
 </entry>

并且我需要获取属性yt:name设置为“hqdefault”的节点的URL.

我尝试使用XPath表达式

'./media:group/media:thumbnail[@yt:name='hqdefault']/@url'

但是似乎使用yt:name指定namespaced属性不起作用.进行查询时,我会收到一个空的DOMNodeList.

我正在PHP访问XML,所以我注册了yt命名空间:

registerNamespace( 'yt','http://gdata.youtube.com/schemas/2007' );

提前Thnx

XPath看起来正确.

可能是您的库不支持命名空间属性,或者您尚未正确注册yt命名空间和/或媒体命名空间.

尝试只匹配在谓词过滤器内的local-name()和namespace-uri(),而不是使用namespace-prefix:

./*[local-name()='group'
      and namespace-uri()='http://search.yahoo.com/mRSS/'
    ]/*[local-name()='thumbnail'
         and namespace-uri()='http://search.yahoo.com/mRSS/'
         and @*[local-name()='name'
                 and namespace-uri()='http://gdata.youtube.com/schemas/2007'
                 and .='hqdefault'
                ]
        ]/@url

如果这样做,那么注册这些命名空间前缀的命名空间是一个问题.

猜你在找的PHP相关文章