XPath 不匹配没有名称空间作为前缀的属性

发布于 2024-11-27 12:21:22 字数 1729 浏览 1 评论 0 原文

目前我正在尝试通过 PHP 的 SimpleXML 读取 Firefox 扩展的不同 install.rdf 文件。

不幸的是,它们的外观没有预定义的结构。 他们总是使用两个命名空间,“http://www.w3。 org/1999/02/22-rdf-syntax-ns#”和“http://www.mozilla.org/2004/em-rdf#”。

所以我的想法是使用 XPath 来获取感兴趣的元素:

$xml = simplexml_load_string($installRDF);
$namespaces = $xml->getNameSpaces(true);
$xml->registerXPathNamespace('rdf', NS_RDF);
$main = $xml->xpath('/rdf:RDF/rdf:Description[@rdf:about="urn:mozilla:install-manifest"]');

但是关于 about 属性的 rdf 前缀似乎存在问题,因为它只返回一个结果,如果 RDF 文件中还定义了前缀。

所以对于这个它是有效的:

<RDF:RDF xmlns:em="http://www.mozilla.org/2004/em-rdf#"
         xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#">

  <RDF:Description RDF:about="urn:mozilla:install-manifest">
    <em:id>[email protected]</em:id>
  </RDF:Description>
</RDF:RDF>

但对于这个不是:

<RDF xmlns:em="http://www.mozilla.org/2004/em-rdf#"
     xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#">

  <Description about="urn:mozilla:install-manifest">
    <em:id>[email protected]</em:id>
  </Description>
</RDF>

这对我来说看起来像是 PHP 中的一个错误,因为如果我从 XPath 中删除该属性,我总是会得到 Description 元素。但我还不知道在 XPath 中使用名称空间,所以我在这里询问。

Currently I'm trying to read different install.rdf files of Firefox extensions via PHP's SimpleXML.

Unfortunately there's no predefined structure how they have to look.
They are always using two namespaces, "http://www.w3.org/1999/02/22-rdf-syntax-ns#" and "http://www.mozilla.org/2004/em-rdf#".

So my idea was to use an XPath to get the elements of interest:

$xml = simplexml_load_string($installRDF);
$namespaces = $xml->getNameSpaces(true);
$xml->registerXPathNamespace('rdf', NS_RDF);
$main = $xml->xpath('/rdf:RDF/rdf:Description[@rdf:about="urn:mozilla:install-manifest"]');

But there seems to be a problem regarding the rdf prefix of the about attribute, because it just returns a result, if there's also a prefix defined in the RDF file.

So for this it works:

<RDF:RDF xmlns:em="http://www.mozilla.org/2004/em-rdf#"
         xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#">

  <RDF:Description RDF:about="urn:mozilla:install-manifest">
    <em:id>[email protected]</em:id>
  </RDF:Description>
</RDF:RDF>

But for this not:

<RDF xmlns:em="http://www.mozilla.org/2004/em-rdf#"
     xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#">

  <Description about="urn:mozilla:install-manifest">
    <em:id>[email protected]</em:id>
  </Description>
</RDF>

This looks like a bug in PHP to me, since if I remove the attribute from the XPath I am always getting the Description elements. But I am not aware of using namespaces in XPath yet, so I am asking here.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

烟若柳尘 2024-12-04 12:21:22

问题是第二个示例中的属性位于空命名空间中。问题不在于查询,而是两个示例的 XML 数据不相等。

请参阅XML 1.0 中的命名空间(第三版)

默认命名空间声明适用于所有无前缀元素
其范围内的名称。默认命名空间声明不适用
直接指向属性名称;无前缀的解释
属性由它们出现的元素决定。

The problem is that the attributes in your second example are in the empty namespace. The problem is not the query, but the XML data of your two examples is not equivalent.

See Namespaces in XML 1.0 (Third Edition):

A default namespace declaration applies to all unprefixed element
names within its scope. Default namespace declarations do not apply
directly to attribute names; the interpretation of unprefixed
attributes is determined by the element on which they appear.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文