使用此Xpath:
//*[@data-auto='citation_field_value'][@xmlns:extendedmarkupcontroller='urn:ExtendedMarkupController']
我希望检索此元素:
<dd data-auto="citation_field_value" xmlns:extendedmarkupcontroller="urn:ExtendedMarkupController">Freeman, Michael K., author</dd>
但是,什么都没有返回:
$xpatho = new DOMXpath($doc);
$elementsn = $xpatho->query($xpath);
$ elementsn-> length给我0。
为什么会这样?是因为结肠吗?以及如何解决?
答案 0 :(得分:0)
“:”表示您的文档正在使用名称空间,而名称空间改变了世界。
对于初学者来说,源XML中的名称空间声明(例如xmlns:extendedmarkupcontroller="urn:ExtendedMarkupController"
)不会成为XDM数据模型中的属性节点,因此您不能使用属性轴(或'@'的简写形式)访问它属性轴)。如果要查找名称在此命名空间中的元素,则要使用的正确谓词是
[namespace-uri()='urn:ExtendedMarkupController']
尽管在您的示例中,元素声明了名称空间,但实际上并没有使用名称空间。在实际上不使用某个名称空间时,测试该元素是否声明了特定的名称空间是非常不寻常的要求。您可以使用名称空间轴来做到这一点:
[namespace::extendedmarkupcontroller="urn:ExtendedMarkupController"]
尽管某些XPath处理器并未完全实现该领域的规范。
对于这个特定问题,这应该足够了,但是如果您开始使用名称空间,我建议您在编写更多代码之前先阅读一下主题,因为存在很多陷阱。