2012-04-26 9 views
2

SimpleXMLElementsでこれを行う方法がないと判断しました。私はPHPのDOMDocumentのマニュアルを読んでいますが、私は反復でそれを行うことができると思いますが、それは非効率的です。私にはうまくいかない方法がありますか?同じ親ノードを持つ2つのXML文書を1つの文書に簡単に結合するにはどうすればよいですか?

擬似コードっぽい反復解法:明確にするために

// two DOMDocuments with same root element 
$parent = new ... 
$otherParent = new ... 

$children = $parent->getElementByTagName('child'); 
foreach ($children as $child) { 
    $otherParent->appendChild($child); 
} 

、私は両方を次のようになり2つのXML文書があります。

<parent> 
     <child> 
     <childOfChild> 
      {etc, more levels of nested XML trees possible} 
     </childOfChild> 
     </child> 
     <child> 
     <childOfChild> 
      {etc, more levels possible} 
     </childOfChild> 
     </child> 

</parent> 

をそして私は、このような出力をしたいと思います:

<parent> 
    {all children of both original XML docs, order unimportant, that preserves any nested XML trees the children may have} 
<parent> 

答えて

2

唯一の共通ノードとして、あなたのクエストを取ると、2つのファイルの間で識別できるルートノードがありますnは、正確かつ厳格なので、解決策は次のようになります。

<doc1:parent> 
    <doc1:children>...</> 
    <doc2:children>...</> 
</doc1:parent> 

あなたは順番を書いたあなたはここで見ることができるように、重要ではありませんが、DOC2はDOC1の後に来ます。上記の例のXML形式の両方含む2つのSimpleXML要素$xml1$xml2のためのコード例:

<?xml version="1.0"?> 
<parent> 
     <child> 
     <childOfChild> 
      {etc, more levels of nested XML trees possible} 
     </childOfChild> 
     </child> 
     <child> 
     <childOfChild> 
      {etc, more levels possible} 
     </childOfChild> 
     </child> 

     <child> 
     <childOfChild> 
      {etc, more levels of nested XML trees possible} 
     </childOfChild> 
     </child> 
     <child> 
     <childOfChild> 
      {etc, more levels possible} 
     </childOfChild> 
     </child> 
</parent> 

あなたが見ることができるように、樹木の:今

$doc1 = dom_import_simplexml($xml1)->ownerDocument; 
foreach (dom_import_simplexml($xml2)->childNodes as $child) { 
    $child = $doc1->importNode($child, TRUE); 
    echo $doc1->saveXML($child), "\n"; 
    $doc1->documentElement->appendChild($child); 
} 

$doc1は、このXMLによって表される文書が含まれています両方のドキュメントは保存されますが、と同じノードがルートノードです(実際には2つのノードでもあります)。したがって、2番目のドキュメントから継承されず、その子のみです。

+0

ありがとうございます。私は繰り返しを使用しない方法があることを期待していましたが、標準に固執してDOMDocumentFragment :: appendXML()を使用しない場合はありません。 –

+0

@ErikaE:技術的には、そこにXMLをドロップすることもできますが、ほぼ同じルーチンだと思うし、 "innerXML"を取得するには、ドキュメントの要素の子を繰り返し処理する必要があります。 – hakre