Bir SimpleXMLElement nesnesi çocuğu olarak XML bir blok ekleme

2 Cevap php

Ben aşağıdaki benzer bir XML kurulum ile bu SimpleXMLElement nesnesi var ...

$xml = <<<EOX
<books>
    <book>
        <name>ABCD</name>
    </book>
</books>
EOX;

$sx = new SimpleXMLElement( $xml );

Şimdi bilgi içeren bir sınıf adlı Kitap var. her kitap hakkında. Aynı sınıf, aynı zamanda kitap bilgilerini tükürmek. Yukarıdaki (iç içe blok) .. örnek akin XML biçiminde,

$book = new Book( 'EFGH' );
$book->genXML();

... will generate
<book>
    <name>EFGH</name>
</book>

Şimdi ben şimdi örneğin ... gibi görünüyor ki ben bir çocuk olarak bu XML bloğu oluşturulan kullanabilir ve ekleyebilirsiniz hangi bir şekilde anlamaya çalışıyorum ..

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

Bu etiket değeri olarak XML verilerini desteklemiyor gibi SimpleXMLElement okudum ne belgeler, bu, sizin için yapılan addChild() almazsınız.

2 Cevap

İki çözümleri. Öncelikle, libxml / DOMDocument / SimpleXML yardımı ile yapın: DOM, bir DOMDocumentFragment oluşturmak için $sx nesneyi içe ve {kullanmak zorunda [ (3)]} :

$doc = dom_import_simplexml($sx)->ownerDocument;

$fragment = $doc->createDocumentFragment();     
$fragment->appendXML($book->genXML());
$doc->documentElement->appendChild($fragment);

// your original $sx is now already modified.

Online Demo bakın.

Ayrıca SimpleXMLElement uzanır ve bu sağlayan bir yöntem ekleyebilirsiniz. Bu özel nesnesi kullanma sonra kolayca aşağıdaki oluşturmak için olanak sağlayacak:

$sx = new MySimpleXMLElement($xml);

$sx->addXML($book->genXML());

Başka bir çözüm zaten yerleşik SimpleDOM gibi bu özelliğe sahip bir XML kitaplığı kullanmaktır. Sen SimpleDOM kapmak ve () yöntemi tarif edilmiştir addXMLChild gibi çalışır InsertXML () kullanın.

include 'SimpleDOM.php';

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

$books->insertXML(
    '<book>
        <name>EFGH</name>
    </book>'
);

Kodumu bir göz atın:

$doc = new DOMDocument();       
$doc->loadXML("<root/>");       

$fragment = $doc->createDocumentFragment();     
$fragment->appendXML("<foo>text</foo><bar>text2</bar>");
$doc->documentElement->appendChild($fragment);

echo $doc->saveXML();

Bu bir XML parçası ekleyerek XML belgesini değiştirir. Online Demo.