2010-06-22 2 views
1

Я пытался объединить два XML-документы, как это:Копирование DOMNodes из одного DOMDocument к другому

$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 объект, но definition говорит, что он должен быть DOMNode объект.

Любая идея, что не так?

ответ

4

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

EDIT: Проблема заключается в том, что вы пытаетесь скопировать в другой документ 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> 
+0

Таким образом, вопрос, как бросить DOMElement к DOMNode, чтобы добавить его? –

+0

@ Radek вам не обязательно. Как я уже сказал, DOMElement * - это * DOMNode через наследование. Просто добавьте его. Проблема в том, что вы пытаетесь скопировать в другой DOMDocument. Сначала вы должны ['importNode'] (http://de3.php.net/manual/en/domdocument.importnode.php) узла в документе перед его добавлением. – Gordon

+0

Пробовал импортировать узел с $ def-> importNode ($ s, true); но по-прежнему получают ту же ошибку. Просто интересно, не проще ли преобразовывать эти документы в массивы, присоединяться к ним и затем преобразовывать обратно в XML-документ :( –

Смежные вопросы