XML名称空间前缀冲突的XPath行为

阿迪南

考虑以下XML:

<?xml version="1.0" encoding="utf-8"?>
<movies xmlns:en="http://english-language.com/">
    <en:movie>
        <title>The Godfather</title>
    </en:movie>
    <en:movie>
        <title>Saving Private Ryan</title>
    </en:movie>
    <something-something xmlns:en="http://english.com/">
        <en:movie>
            <title>The Fellowship of the Ring</title>
        </en:movie>
    </something-something>
</movies>

下面的代码与“教父”和“拯救大兵瑞恩”匹配但为什么?我希望它会失败。似乎查询会忽略名称空间名称(URI),而使用名称空间前缀

$xpath      = new DOMXpath($dom);
$xpath->registerNamespace('en', 'http://complete-nonsense');
$elements   = $xpath->query("//en:movie");

我希望下面的代码与《指环王》相匹配,但还是与《教父》和《拯救大兵瑞恩》相匹配

$xpath      = new DOMXpath($dom);
$xpath->registerNamespace('en', 'http://english.com/');
$elements   = $xpath->query("//en:movie");

只是现在URI似乎没有什么不同,现在它与The Fellowship of the Ring匹配

$xpath      = new DOMXpath($dom);
$xpath->registerNamespace('english', 'http://english.com/');
$elements   = $xpath->query("//english:movie");

这是为什么?PHP的实现有问题吗?

W

DOMXpath::evaluate()/DOMXpath::query()在手动注册的上下文节点顶部注册当前上下文节点的名称空间定义。基本上,文档将覆盖名称空间作为前缀。第三个参数(因为PHP> = 5.3.3)可以禁用自动注册:

$document = new DOMDocument();
$document->loadXML($xml);
$xpath = new DOMXpath($document);
$xpath->registerNamespace('en', 'http://english.com/');

// the xmlns:en from the document element overrides the registration
var_dump($xpath->evaluate('normalize-space(//en:movie)'));
// automatic registration disabled - works correctly
var_dump($xpath->evaluate('normalize-space(//en:movie)', NULL, FALSE));

输出:

string(13) "The Godfather"
string(26) "The Fellowship of the Ring"

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

xpath:前缀必须解析为名称空间

XPath检查前缀绑定到的名称空间

Azure Logic应用-具有名称空间前缀的xml的xpath

在XPather.com上使用XML名称空间的奇怪XPath行为?

具有不同名称空间前缀的XPath导航

带xpath的python etree和带前缀的名称空间

XPath JMeter断言:错误“前缀必须解析为名称空间”

在具有名称空间前缀的元素内创建不带名称空间前缀的XML元素

LXML名称空间前缀

XPath如何处理XML名称空间?

默认的XML名称空间,JDOM和XPath

XML:从名称空间生成带有前缀的标签

XML中是否可以有多个名称空间前缀?

使用Unmarshal在Go中获取XML名称空间前缀

如何通过前缀获取xml文件的名称空间(常规)

更改使用JAXWS生成的默认XML名称空间前缀

xml名称空间前缀问题随处可见

XML:子节点是否继承父节点的名称空间前缀?

如何用内联xmlns声明替换XML名称空间前缀?

在Java DOM中创建以名称空间为前缀的XML节点

XML错误:前缀未绑定到名称空间,KML文件

如何使用XSLT删除特定xml元素的名称空间前缀?

python 2.7 XML lxml名称空间前缀属性问题

如何使用Xstream从xml删除名称空间前缀?

在xml消息中插入几个带前缀的名称空间

Swift名称空间冲突

将XML名称空间前缀替换为完整的名称空间URI值?

从外壳程序向XML文档的默认名称空间的标签添加名称空间前缀。

名称空间和类模板之间的名称冲突:不同的编译器行为