我有一个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@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,但是这个场景。
答案 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']]