2015-11-12 60 views
1

我正在尋找將xml樹追加到另一個xml樹。使用DOMDocuments在PHP中將xml樹附加到另一個xml樹

例如,我想下面的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

另外,處理諸如merging documents使用XSLT XML轉換的原生方式,專用語言主要用於這方面的需要重新構造,重新作風,爲各種終端重新格式化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(負載僅第一DOC如XSLT上述載荷在特定節點第二DOC)

$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); 

OUTPUT

<?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>