PHP'nin DOM API ile ardışık çocukları ekleme

1 Cevap php

PHP'nin DOM SimpleXML bazı kod hareket ediyorum ve oldukça henüz nesneleri alamadım.

SimpleXML, örneğin, ben çok kolay şöyle iç içe elemanları yaratabilir:

$Settings = new SimpleXMLElement("<root></root>");
$Settings->addChild('el1');
$Settings->el1->addChild('el2');
$Settings->el1->el2->addChild('el3');
$Settings->el1->el2->el3->addChild('el4', 'text');

echo("<pre>".htmlspecialchars(str_replace("><", ">\n<",$Settings->asXML()))."</pre>");

// Result
<?xml version="1.0"?>
<root>
<el1>
<el2>
<el3>
<el4>text</el4>
</el3>
</el2>
</el1>
</root>

Ben belirli bir öğe için bir DOMElement almak için bunun üzerinden bir listesini ve döngü kolları izlemek, ya da getirmek ya gerekiyor gibi DOM se, öyle görünüyor. Eksik kolay bir yolu olmalı ...

Ben aşağıdaki kodu var ve yukarıdaki gibi vb, el3, el1, el2 eklemek istiyorsanız söyleyin. Bunu yapmak için en az ayrıntılı yolu nedir? Tercihen her düğüm için bir tutamak olarak bir değişken olması gerek kalmadan ben, ya da döngüler üzerinden onları almak zorunda bir çocuk eklemek istiyorum.

$DOMXML = new DOMDocument();
$DOMXML->appendChild($DOMXML->createElement('root'));
$DOMXML->documentElement->appendChild($DOMXML->createElement('el1));
// ...


echo($DOMXML->saveXML(););

1 Cevap

I don't think there is a way to do what you want using DOM :-(
I tried a while ago, when I had to generate some XML files with DOM...

Ben ile gelebilir tek şey muhtemelen atıfta ne gibi bir şey oldu; kod çok uzun demet; Bu gibi sanırım:

$DOMXML = new DOMDocument();

$root = $DOMXML->createElement('root');
$DOMXML->appendChild($root);

$elt1 = $DOMXML->createElement('el1');
$root->appendChild($elt1);

$elt2 = $DOMXML->createElement('el2');
$elt1->appendChild($elt2);

$elt3 = $DOMXML->createElement('el3');
$elt2->appendChild($elt3);

$elt4 = $DOMXML->createElement('el4');
$elt4->appendChild($DOMXML->createTextNode('text'));
$elt3->appendChild($elt4);

echo("<pre>".htmlspecialchars(str_replace("><", ">\n<",$DOMXML->saveXML()))."</pre>");

That is indeed quite long :-(
OK, it's powerful, you can do lots of things with it... But, still, a pain to write ^^


Alternatif bir çözüm SimpleXML ve DOM birleşik güçlerini hem de kullanmak olacaktır:

İlk olarak, daha önce de söylediğim gibi, SimpleXML kullanarak (sadece) XML belgesi oluşturmak:

$simple2 = new SimpleXMLElement("<root></root>");
$simple2->addChild('el1');
$simple2->el1->addChild('el2');
$simple2->el1->el2->addChild('el3');
$simple2->el1->el2->el3->addChild('el4', 'text');

Ve sonra, kullanarak, DOMDocument dönüştürmek dom_import_simplexml :

// Convert to DOMDocument
$dom2 = new DOMDocument();
$dom2->appendChild(
    $dom2->importNode(
        dom_import_simplexml($simple2), 
        true
    )
);

// Now, you can do your stuff that requires a DOMDocument object ;-)
// Well, right now, displaying it will be enough, I suppose ?

echo("<pre>".htmlspecialchars(str_replace("><", ">\n<",$dom2->saveXML()))."</pre>");

Tam olarak aynı çıktıya alırsınız:

<?xml version="1.0"?>
<root>
<el1>
<el2>
<el3>
<el4>text</el4>
</el3>
</el2>
</el1>
</root>

Bu basit çözüm, ne de en verimli bir olmayabilir ... Ama bu çalışma ve iş yapıyor gibi görünüyor ;-)

Herkes başka bir fikir varsa ... Ben uğraşmak gerekecek sonraki süre için, çok ilgileniyorum DOMDocument!