我难以一次性去除所有针对某个 ns-uri 的默认 NS 属性,不过以下方法有效……首先去除 documentElement 命名空间,然后使用 getElementsByTagNameNS()——文档应该反映出第二个参数实际上是标签的名称,而不是我最初预期的本地命名空间前缀。
<?php
function strip_default_ns( $xml = null, $ns_uri = 'http://example.com/XML-Foo' ) {
$ns_local = '';
$ns_tag = '*';
if ( empty($xml) ) return false;
// 删除文档命名空间
$dom = new DOMDocument();
$dom->loadXML($xml);
$dom->documentElement->removeAttributeNS($ns_uri, $ns_local);
// 删除元素命名空间
foreach ( $dom->getElementsByTagNameNS($ns_uri, $ns_tag) as $elem ) {
$elem->removeAttributeNS($ns_uri, $ns_local);
}
return $dom->saveXML();
}
$stripped_xml = strip_default_ns($the_xml);
?>
现在 $stripped_xml 可以利用在其上运行 XPath 查询来处理 NULL 命名空间。