1

我将一个 XML 文件加载到 PHP DOM 操作系统中,如下所示:

$xml = file_get_contents('something.xml');
$dom = new DOMDocument();
$dom->loadXML($xml);

XML 文件中有各种带有 XMLNS 标签的元素,类似于以下内容:

<email xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple">example&commat;email.com</email>

<graphic xlink:href="example-image.tif" alt-version="no" mimetype="image" position="float" xlink:type="simple"></graphic>

我想去掉诸如“xmlns:xlink”和“xlink:type”之类的属性而不删除元素。

是否有一个 xpath 查询将返回每个元素的属性名称 = "xmlns:xlink" 或 "xlink:type" 或...什么?

我试过这样的事情:

$xpath->query('//*[@xmlns:xlink]')

或者

$xpath->query('//*[@xmlns:xlink=*]')

但那些不起作用;我只是在黑暗中刺伤。我真的无法为 xpath 找到一个好的参考,因此非常欢迎一些体面的阅读以及对这个问题的回答。我能够为除此之外的所有其他相关场景生成 xqueries。

4

1 回答 1

0

@xmlns实际上不是您可以查询的属性(尽管它看起来像一个),而是命名空间声明。它应该尽快被删除,因此使用该命名空间的所有子元素及其各自的属性都被删除(在该命名空间之外)。

您可以使用此 XPath 表达式查询命名空间中的所有元素和属性:

(
  //*[namespace-uri(.) = 'http://www.w3.org/1999/xlink']
    |
  //@*[namespace-uri(.) = 'http://www.w3.org/1999/xlink']
)

(可以省略换行符)


要访问xlink命名空间中的属性,您必须使用元素xlink声明中给出的前缀和 URL来注册该命名空间。<email/>请参阅您正在使用的 XPath API 的手册。

这将返回命名空间中具有@href属性的所有元素xlink

//*[@xlink:href]

要在 XPath 1.0 中查找命名空间中的所有属性xlink(两个 PHP 的内部 API 仅支持该属性),您需要在谓词中进行过滤:

//*[@*[namespace-uri(.) = 'http://www.w3.org/1999/xlink']]
于 2013-08-13T07:14:54.420 回答