質問

次のような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ドキュメントを変更します。 オンラインデモ

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top