使用PHP的xpath选择属性值

时间:2009-06-18 11:32:53

标签: php xpath

我是xpath的新手,并且遇到了PHP的古老XPath实现的麻烦。是正确的,//@url只是//attribute::url的缩写形式吗?我正在尝试查询flickr rss进行测试,但是缩写查询找到了正确的节点,而详细的查询返回0个元素:

$xml = file_get_contents('http://api.flickr.com/services/feeds/geo/?format=rss_200');
$doc = new DOMDocument();
$doc->loadXML($xml);
$xpath = new DOMXPath($doc);
$xpath->query('//media:content/@url')->length > 0;
$xpath->query('//media:content/attribute::url')->length == 0;

我是否误解了w3c specs或者这是一个PHP错误?

相关问题:

成功查询按预期返回DOMAttr个对象。但是没有办法直接得到这些节点的文本值吗?像//media:content/attribute::url/child::text()这样的东西?我需要一个工具,其中xpath查询将由用户输入,如果我可以期待DOMText对象(而不是编码大量DOM *对象),错误检测会更好。

2 个答案:

答案 0 :(得分:4)

看起来你可能已经登陆了那里的一个bug。它对我来说看起来很好。

关于你的相关问题,使用evaluate而不是查询来让php尝试返回一个类型化的结果。如果失败,则返回正常的节点列表

编辑:

您是否尝试过添加namespace?媒体:部分可能会把它扔掉一个循环。 e.g。

$xpath->registerNamespace('media', "http://search.yahoo.com/mrss/");

编辑2: 仅供参考,我也使用以下

在javascript中尝试了这个
function nsResolve() {
    return "http://search.yahoo.com/mrss/"
}

document.evaluate("//media:content/attribute::url",document,nsResolve,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);

,它与使用@url(目前有7个结果)

的工作原理相同

答案 1 :(得分:0)

//*@url是否有效?