php - 在 PHP 中使用 DOMXPath 获取 XML 属性,忽略命名空间

标签 php xml dom xpath

我有一个 XML 文件:

<Receipt Version="2.0" ReceiptDate="2012-08-30T23:10:05Z" CertificateId="A656B9B1B3AA509EEA30222E6D5E7DBDA9822DCD" xmlns="http://schemas.microsoft.com/windows/2012/store/receipt">
....
</Receipt>

我尝试在 PHP 中使用 XPath 获取 CertificateId:

$doc = new DOMDocument();
$doc->loadXML($v);
$xpath = new DOMXPath($doc);
$query = 'string(/Receipt/@CertificateId)';
$id = $xpath->evaluate($query);

$id 无效,因为 Msft 已放弃此链接,因此命名空间不可访问,也就是说我必须忽略 CertificateId命名空间(如果我从 XML 中删除命名空间字符串,我的代码可以工作,但我不想编辑 XML)。我知道可以使用 local-name() XPath 函数来完成,但是如何在 PHP 中执行此操作?


这是我从 DOM 读取它的方式:

        $id = null;
        if ($doc->childNodes->length > 0)
        {
            $root = $doc->childNodes->item(0);
            if ($root->nodeName == 'Receipt')
                $id = $root->attributes->getNamedItem('CertificateId')->nodeValue;
        }

此代码忽略 namespace 。但是如何使用 XPath 来做到这一点呢?

最佳答案

在 XPath 2.0 中,您可以对命名空间部分使用通配符:string(//*:Receipt/@CertificateId)。然而,据我所知,PHP 目前仅实现 XPath 1.0。

您可以注册命名空间:

$xpath->registerNamespace('x', 'http://schemas.microsoft.com/windows/2012/store/receipt');
$query = 'string(//x:Receipt/@CertificateId)';

或者如果您甚至不想提及特定命名空间,则仅选择属性:

$query = 'string(//*/@CertificateId)';

否则,您将被迫使用本地名称:

$query = "string(//*[local-name(.) = 'Receipt']/@CertificateId)";

关于php - 在 PHP 中使用 DOMXPath 获取 XML 属性,忽略命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40561362/

相关文章:

javascript - 加载文档时填充选择框

php mysql join 查询别名

php - Codeigniter查询构建器类: How to correctly handle possible unexpected errors?

java - 设置 setOnItemSelectedListener 时微调器错误

php - 如何将数组(不同)插入到 mySQL 中?

android - android中的布局问题

android - 带有 TabLayout 的 ViewPager2 未导航到正确的选项卡

javascript - 通用库的 <svg> 的 setAttributeNS xmlns

javascript - 从 Javascript 查找 HTML 元素像素尺寸

javascript - 删除 Javascript 生成的 HTML