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

问题描述 投票:3回答:1

考虑以下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>

下面的这段代码将匹配The GodfatherSaving Private Ryan。但为什么?我期望它会失败。似乎查询忽略了名称空间名称(URI),而使用了名称空间前缀

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

我希望下面的代码匹配The Fellowship of the Ring] >>,但它再次匹配The GodfatherSaving Private Ryan

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

现在只是URI似乎没有什么区别,现在它与指环的奖学金

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

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

请考虑以下XML: [教父

php xml dom xpath
1个回答
1
投票
DOMXpath::evaluate() / DOMXpath::query()将当前上下文节点的名称空间定义注册在手动注册的名称之上。基本上,文档将覆盖名称空间作为前缀。第三个参数(因为PHP> = 5.3.3)可以禁用自动注册:
© www.soinside.com 2019 - 2024. All rights reserved.