Копировать DOMNode из одного DOMDocument в другой - PullRequest
1 голос
/ 22 июня 2010

Я пытался объединить два 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 объект.

Есть идеи, что в этом плохого?

1 Ответ

4 голосов
/ 22 июня 2010

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

РЕДАКТИРОВАТЬ: Проблема в том, что вы пытаетесь скопировать в другой DOMDocument.Вы должны 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...