Рекурсивное добавление детей с помощью PHP DOM API - PullRequest
2 голосов
/ 30 июля 2009

Я перемещаю некоторый код из SimpleXML в PHP DOM и пока не совсем получаю объекты.

Например, в SimpleXML я могу очень легко создавать вложенные элементы, например:

<code>$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()))."
"); // Результат <? xml version = "1.0"?> текст </ EL4> </ EL3> </ EL2> </ El1>

в DOM, похоже, мне нужно либо отслеживать маркеры, либо извлекать список и перебирать его, чтобы получить элемент DOME для определенного элемента. Там должно быть более простой способ, что я скучаю ...

Допустим, у меня есть код ниже, и я хочу добавить el1, el2, el3 и т. Д., Как указано выше. Какой наименее многословный способ сделать это? Желательно без необходимости иметь переменную в качестве дескриптора для каждого узла, к которому я хочу добавить дочерний элемент, или необходимости извлекать их через циклы.

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


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

1 Ответ

0 голосов
/ 30 июля 2009

Я не думаю, что есть способ сделать то, что вы хотите, используя DOM :-(
Я пытался некоторое время назад, когда мне нужно было сгенерировать некоторые XML-файлы с помощью DOM ...

Единственное, что я мог придумать, было что-то вроде того, к чему вы, вероятно, обращаетесь; длинный длинный пакет кода; вот так я полагаю:

<code>$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()))."
");

Это действительно довольно долго :-(
Ладно, это мощно, с этим можно многое сделать ... Но все же писать боль ^^


Альтернативным решением было бы использование обеих возможностей SimpleXML и DOM:

Во-первых, создайте (просто) свой XML-документ, используя SimpleXML, как вы сказали ранее:

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

А затем преобразовать его в DOMDocument, используя dom_import_simplexml:

<code>// 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()))."
");

Вы получите точно такой же выход:

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

Возможно, это не самое простое и не самое эффективное решение ... Но, похоже, оно работает и выполняет свою работу; -)

Если у кого-то есть другая идея ... Мне тоже интересно, в следующий раз мне придется иметь дело с DOMDocument!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...