如何为元素分配新的命名空间?

时间:2013-09-26 22:27:15

标签: php xml dom xpath namespaces

我正在尝试使用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有很多孩子,所以重新创建它及其子女(谁应该通过by继承element的新命名空间)也是一个缓慢而艰苦的过程。

1 个答案:

答案 0 :(得分:0)

创建元素时,请致电createElementNS