提问人:Eli 提问时间:7/30/2009 最后编辑:Keith PinsonEli 更新时间:2/14/2013 访问量:2434
使用 PHP 的 DOM API 递归添加子项
Adding children recursively with PHP's DOM API
问:
我正在将一些代码从 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。一定有一种更简单的方法让我错过了......
假设我有下面的代码,并想像上面一样添加、、等。最不冗长的方法是什么?最好不必将变量作为要添加子节点的每个节点的句柄,也不必通过循环获取它们。el1
el2
el3
$DOMXML = new DOMDocument();
$DOMXML->appendChild($DOMXML->createElement('root'));
$DOMXML->documentElement->appendChild($DOMXML->createElement('el1));
// ...
echo($DOMXML->saveXML(););
答:
0赞
Pascal MARTIN
7/30/2009
#1
我不认为有办法使用 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
评论
0赞
Eli
7/30/2009
谢谢!也许我可以将所有句柄保留在某种数组中,以避免有几十个变量。希望我能只使用 simplexml(我最初是),但我正在处理一个讨厌它的对象。我不知道为什么,但这个图表拒绝与任何与SimpleXML有关的东西一起使用。amcharts.com/forum/viewtopic.php?pid=9418#p9418
评论