3

SimpleXMLElements でこれを行う方法はないと判断しました。私は PHP DOMDocument マニュアルを読んでいて、反復でそれを行うことができると思いますが、それは非効率的です。私に起こっていないより良い方法はありますか?

疑似コードっぽい反復ソリューション:

// 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>
4

1 に答える 1

2

2 つのファイル間で識別できる唯一の共通ノードはルート ノードになるため、質問を正確かつ厳密に行うと、解決策は次のようになります。

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

順序は重要ではないと書いたので、ここでわかるように、doc2 は doc1 の後に来ます。2 つの SimpleXML 要素のコード例で、上記の両方の XML フォームの例を含んでいます$xml1$xml2

$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 で表されるドキュメントが含まれています。

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

ご覧のとおり、両方のドキュメントのツリーが保持されます。同じように記述したノードのみがルート ノード (実際には 2 つのノードでもあります) であるため、2 番目のドキュメントから引き継がれるのではなく、子のみです。

于 2012-04-26T22:09:22.837 に答える