4

次のような 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 データをタグ値としてサポートしていないため、これを実行できません。

4

2 に答える 2

4

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

もう1つの解決策は、SimpleDOMのようにこの機能がすでに組み込まれているXMLライブラリを使用することです。SimpleDOMを取得し、insertXML()を使用します。これは、説明したaddXMLChild()メソッドのように機能します。

include 'SimpleDOM.php';

$books = simpledom_load_string(
    '<books>
        <book>
            <name>ABCD</name>
        </book>
    </books>'
);

$books->insertXML(
    '<book>
        <name>EFGH</name>
    </book>'
);
于 2009-12-01T07:49:46.127 に答える
4

私のコードを見てください:

$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 ドキュメントが変更されます。オンラインデモ

于 2010-05-01T08:16:38.627 に答える