0

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

4

1 に答える 1

0

要素を作成するときは、 を呼び出しますcreateElementNS

于 2013-09-26T22:29:45.560 に答える