2015-11-12 1 views
1

Я ищу, чтобы добавить дерево xml к другому.Добавить дерево xml в другое дерево xml в PHP с помощью DOMDocuments

Например, я хочу следующий XML:

<a> 
    <b> 
    <c/> 
    </b> 
</a> 

Чтобы иметь следующий XML внутри него:

<n:d xmlns:xsl="namespace"> 
    <n:e> 
    <n:f/> 
    </n:e> 
</n:d> 

так, что это выглядит следующим образом:

<a> 
    <b> 
    <c/> 
    <n:d xmlns:n="namespace"> 
     <n:e> 
     <n:f/> 
     </n:e> 
    </n:d> 
    </b> 
</a> 

код, который я пытаюсь сделать и не могу сделать это, выглядит следующим образом:

$doc1 = new DOMDocument(); 
$doc2 = new DOMDocument(); 

$doc1->loadXML($xml1); 
$doc2->loadXML($xml2); 

$node_To_Insert = $doc2->getElementsByTagName('d')->item(0); 
$node_To_Be_Inserted_To = $doc1->getElementsByTagName('b')->item(0); 

$node_To_Be_Inserted_To->appendChild($doc1->importNode($node_To_Insert)); 

echo '<pre>'.htmlspecialchars(print_r($doc1->saveXML(),true)).'</pre>'; 

Текущий результат я получаю от эха:

<a> 
    <b> 
    <c/> 
    <n:d xmlns:n="namespace" /> 
    </b> 
</a> 

Я из идей, которые не невозможно читать, или не являются, казалось бы, тупо окольными.

Любая помощь будет оценена по достоинству. Заранее спасибо.

ответ

2

Ваше решение очень близко. Вам нужно всего лишь выполнить команду deep copy with importNode, чтобы получить нужный результат.

$node_To_Be_Inserted_To->appendChild($doc1->importNode($node_To_Insert, true)); 
1

Альтернативно, нативный способ обработки преобразования XML, такие как merging documents это с помощью XSLT, язык специального назначения, предназначенный в первую очередь для этого необходимо повторно структуры, повторно стиль, XML документы переформатировать для различных конечных пользователей -использование потребностей.

Многоязычный язык SQL, предназначенный для баз данных, XSLT удобен с XML-файлами. И PHP оснащен процессором XSLT (возможно, потребуется включить расширение: php_xsl.so).

XSLT(сохранить как .xsl или .xslt файл)

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:output version="1.0" encoding="UTF-8" indent="yes" /> 
<xsl:strip-space elements="*" /> 

    <!-- Identity Transform --> 
    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="b"> 
    <b> 
     <xsl:copy-of select="c" /> 
     <xsl:copy-of select="document('doc2.xml')"/> 
    </b> 
    </xsl:template> 
</xsl:transform> 

PHP(нагрузка только первый документ, как XSLT выше нагрузок второй документ на конкретный узел)

$doc1 = new DOMDocument();  
$doc1->load('doc1.xml'); 

$xsl = new DOMDocument; 
$xsl->load('XSLTScript.xsl'); 

// Configure the transformer 
$proc = new XSLTProcessor; 
$proc->importStyleSheet($xsl); 

// Transform XML source 
$newXml = $proc->transformToXML($doc1); 

// Save output to file 
$xmlfile = 'Output.xml'; 
file_put_contents($xmlfile, $newXml); 

ВЫХОД

<?xml version="1.0" encoding="UTF-8"?> 
<a> 
    <b> 
    <c/> 
    <n:d xmlns:n="namespace"> 
     <n:e> 
     <n:f/> 
     </n:e> 
    </n:d> 
    </b> 
</a>