Скопировать DOMNodes из одного DOMDocument в другой

Я пытался объединить два XML-документа следующим образом:

$def = new DOMDocument( '1.0' ); $rdef = new DOMDocument( '1.0' ); $def->load( $path ); $rdef->loadXML( $info ); $r = $def->getElementsByTagName( 'repository' )->item( 0 ); $s = $rdef->getElementsByTagName( 'repository' )->item( 0 ); try { $r->appendChild( $s ); } catch ( DOMException $e ) { SPConfig::debOut( get_class( $s ) ); SPConfig::debOut( $e->getMessage() ); } 

Результат:

 DOMElement Wrong Document Error 

Поэтому мне кажется, что $rdef->getElementsByTagName( 'repository' )->item( 0 ) возвращает объект DOMElement, но определение говорит, что это должен быть объект DOMNode .

Любая идея, что в этом плохого?

Related of "Скопировать DOMNodes из одного DOMDocument в другой"

Ничего плохого в этом нет. DOMNodeList может содержать любые экземпляры DOMNode или их подклассы. DOMElement расширяет DOMNode, поэтому технически DOMElement также является DOMNode. То же самое для DOMAttr.

EDIT: Проблема заключается в том, что вы пытаетесь скопировать в другой DOMDocument. importNode необходимо importNode узел в документ перед его добавлением.

EDIT2: Попробуйте это, пожалуйста:

 $r = $def->getElementsByTagName( 'repository' )->item( 0 ); $s = $rdef->getElementsByTagName( 'repository' )->item( 0 ); $i = $def->importNode( $s, TRUE ); $r->appendChild( $i , TRUE ); 

EDIT3: полный пример

 $srcXML = <<< XML <repositories> <repository> <element>foo</element> </repository> </repositories> XML; $destXML = <<< XML <repositories> <repository> <element>bar</element> </repository> </repositories> XML; $srcDoc = new DOMDocument; $destDoc = new DOMDocument; $destDoc->formatOutput = TRUE; $destDoc->preserveWhiteSpace = FALSE; $srcDoc->loadXML( $srcXML ); $destDoc->loadXML( $destXML ); $destNode = $destDoc->getElementsByTagName('repository')->item( 0 ); $srcNode = $srcDoc->getElementsByTagName('repository')->item( 0 ); $import = $destDoc->importNode($srcNode, TRUE); $destNode->parentNode->appendChild($import); echo $destDoc->saveXML(); 

дает

 <?xml version="1.0"?> <repositories> <repository> <element>bar</element> </repository> <repository> <element>foo</element> </repository> </repositories>