を使用して、既存のドキュメントの途中にある要素に新しい名前空間を割り当てようとしています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
by の新しい名前空間を継承する必要があります) を再作成することも、遅くて骨の折れるプロセスになります。