SimpleXMLElementオブジェクトの子としてXMLのブロックを追加する
質問
次のようなXML設定のこのSimpleXMLElementオブジェクトがあります...
$xml = <<<EOX
<books>
<book>
<name>ABCD</name>
</book>
</books>
EOX;
$sx = new SimpleXMLElement( $xml );
今、情報を含むBookという名前のクラスがあります。各本について。同じクラスが本情報を吐き出すこともできます。上記に似たXML形式(ネストされたブロック)..例、
$book = new Book( 'EFGH' );
$book->genXML();
... will generate
<book>
<name>EFGH</name>
</book>
今、この生成されたXMLブロックを使用し、その子として追加する方法を見つけようとしているので、たとえば.....
// Non-existent member method. For illustration purposes only.
$sx->addXMLChild( $book->genXML() );
...XML tree now looks like:
<books>
<book>
<name>ABCD</name>
</book>
<book>
<name>EFGH</name>
</book>
</books>
SimpleXMLElementで読んだドキュメントでは、 addChild()はタグ値としてXMLデータをサポートしていないため、これを実行できません。
解決
2つのソリューション。最初に、libxml / DOMDocument / SimpleXMLの助けを借りてそれを行います: $ sx
オブジェクトを DOM 、 DOMDocumentFragment
を作成し、 DOMDocumentFragment :: appendXML()
:
$doc = dom_import_simplexml($sx)->ownerDocument;
$fragment = $doc->createDocumentFragment();
$fragment->appendXML($book->genXML());
$doc->documentElement->appendChild($fragment);
// your original $sx is now already modified.
オンラインデモを参照してください。
SimpleXMLElement から拡張して、これを提供するメソッドを追加することもできます。この特殊なオブジェクトを使用すると、次のものを簡単に作成できます。
$sx = new MySimpleXMLElement($xml);
$sx->addXML($book->genXML());
別の解決策は、 SimpleDOM のようなこの機能が既に組み込まれているXMLライブラリを使用することです。 SimpleDOM を取得し、addXMLChild()メソッドと同様に機能するinsertXML()を使用します。説明していました。
include 'SimpleDOM.php';
$books = simpledom_load_string(
'<books>
<book>
<name>ABCD</name>
</book>
</books>'
);
$books->insertXML(
'<book>
<name>EFGH</name>
</book>'
);
他のヒント
私のコードを見てください:
$doc = new DOMDocument();
$doc->loadXML("<root/>");
$fragment = $doc->createDocumentFragment();
$fragment->appendXML("<foo>text</foo><bar>text2</bar>");
$doc->documentElement->appendChild($fragment);
echo $doc->saveXML();
これは、XMLフラグメントを追加してXMLドキュメントを変更します。 オンラインデモ。
所属していません StackOverflow