查找xpath查询以选择XML文件中具有特定属性的元素,而不管其值如何

时间:2013-08-13 06:22:09

标签: php xml xpath xml-parsing

我有一个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,但是这个场景。

1 个答案:

答案 0 :(得分:0)

@xmlns实际上不是一个可以查询的属性(虽然它看起来像一个),而是一个名称空间声明。 应该一旦被强制删除,所以使用该命名空间的所有子元素及其各自的属性将被删除(在该命名空间之外)。

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

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

(可以省略换行符)


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

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

//*[@xlink:href]

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

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