Bir düğüm bir çocuk başa eklemek için nasıl SimpleXML?

3 Cevap php

Ben çağırdığınızda

addChild('actor', 'John Doe');

Bu çocuk son eklenir. Bu yeni çocuk ilk çocuk yapmak için bir yolu var mı?

3 Cevap

Bu Mentionned oldu gibi DOM kullanmak olurdu yani, SimpleXML ki desteklemiyor. İşte ne tavsiye: Eğer programlarınızda kullanmak için ne gerekiyorsa ile SimpleXMLElement uzatmak. Bu şekilde, gerçek programının dışında tüm DOM manipülasyon ve diğer XML sihirli tutabilirsiniz. Ayrı iki konuyu tutarak, okunabilirliği ve teknikleri geliştirmek.

İşte yeni bir yöntem PrependChild ile SimpleXMLElement uzatmak için nasıl ():

class my_node extends SimpleXMLElement
{
    public function prependChild($name, $value)
    {
        $dom = dom_import_simplexml($this);

        $new = $dom->insertBefore(
            $dom->ownerDocument->createElement($name, $value),
            $dom->firstChild
        );

        return simplexml_import_dom($new, get_class($this));
    }
}

$actors = simplexml_load_string(
    '<actors>
        <actor>Al Pacino</actor>
        <actor>Zsa Zsa Gabor</actor>
    </actors>',
    'my_node'
);

$actors->addChild('actor', 'John Doe - last');
$actors->prependChild('actor', 'John Doe - first');

die($actors->asXML());

SimpleXML yapıyor destekler gibi iki seçeneğiniz var, bu yüzden görünmüyor:

  1. Yerine (veya diğer XML modüllerinden biri, muhtemelen) DOM modülünü kullanmak, ve DOMNode::insertBefore method kullanın veya

  2. Bundan sonra orijinal düğümün tüm çocukları ekleyin, sonra, yeni bir SimpleXMLElement oluşturma nitelikleri üzerinde kopyalayın, sonra yeni bir düğüm eklemek, daha sonra yenisi ile orijinal değiştirin.

update: After a bit more looking through the docs, I'd suggest something like the following (assuming you still want to stick with SimpleXML for the most part, otherwise, just use DOM directly for everything):

$dom_elem = dom_import_simplexml($simple_xml_element);
$dom_elem->insertBefore(dom_import_simplexml($new_element), $dom_elem->firstChild);

Eğer aşağıdaki işlevi kullanabilirsiniz insert_before Eğer işlevini kullanabilirsiniz varsayarak:

function prependChild(parent, node) { parent.insertBefore(node, parent.firstChild); }

Kaynak Referans: XML Matters: Beyond the DOM