我有一个 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/