>我正在尝试使用 createAttribute
为现有文档中间的元素分配一个新的命名空间。(信不信由你,但这种方法对我的数据集最有意义。
$doc = new DOMDocument();
$doc->loadXML( '<doc xmlns="urn:x-one"><element><child1ofmany/></element></doc>' );
$xmlns = $doc->createAttribute( 'xmlns' );
$xmlns->value = 'urn:x-two';
$doc->getElementsByTagName( 'doc' )->item( 0 )->getElementsByTagName( 'element' ).appendChild( $xmlns );
echo $doc->saveXML();
/*
<?xml version="1.0" encoding="UTF-8"?>
<doc xmlns="urn:x-one">
<element xmlns="urn:x-two">
<child1ofmany/>
</element>
</doc>
*/
然而,这只在表面上起作用。使用文档上的 XSLTProcessor
或 XPath 将显示element
仍属于 urn:x-one
命名空间。
我发现的唯一解决方法是字符串化$doc
并再次将字符串读取为 XML。 喜欢这个:
$doc->loadXML( $doc->saveXML() );
肯定有更好的方法来实现这一目标吗?
PS:element
有大量的孩子,所以重新创建它和它的子项(他们应该继承element
的新命名空间)也将是一个缓慢而艰苦的过程。
创建元素时,调用 createElementNS
。