Я пытался объединить два 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 .
Любая идея, что в этом плохого?
Ничего плохого в этом нет. 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>