使用PHP的DOM API递归添加子项

时间:2009-07-29 21:14:29

标签: php xml dom

我正在将一些代码从SimpleXML转移到PHP的DOM,但还没有得到对象。

例如,在SimpleXML中,我可以非常轻松地创建嵌套元素:

$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>
但是在DOM中,似乎我需要跟踪句柄,或者获取列表并循环遍历它以获取特定元素的DOMElement。必须有一种我想念的简单方法......

说我有以下代码,并希望像上面一样添加el1el2el3等。最简单的方法是什么?最好不要将变量作为每个节点的句柄,我想要添加子节点,或者必须通过循环获取它们。

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


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

1 个答案:

答案 0 :(得分:0)

我认为没有办法用DOM做你想做的事:-( 我不久前尝试过,当时我不得不用DOM生成一些XML文件......

我能想出的唯一一件事就是你可能会提到的东西;一长串代码;像这样,我想:

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

确实很长:-(
好吧,它很强大,你可以用它做很多事情......但是,仍然,写一个痛苦^^


另一种解决方案是同时使用SimpleXML和DOM的组合功能:

首先,使用SimpleXML(简单地)创建XML文档,如前所述:

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

然后,使用dom_import_simplexml

将其转换为DOMDocument
// 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>");

你将获得完全相同的输出:

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

它可能不是最简单的解决方案,也不是最有效的解决方案......但它似乎正在起作用,并且正在完成工作; - )

如果有人有其他想法......我也很感兴趣,下次我将不得不处理DOMDocument