PHP中DOMDocument与createElement是否支持乱序追加子元素?
PHP DOMDocument 元素操作灵活性说明
核心结论
完全支持灵活操作,元素的最终位置由你最后追加到文档树的顺序决定,和填充子元素的先后顺序无关。DOMDocument基于节点树结构而非线性缓冲区构建,所有元素在被添加到文档树前都是独立的"节点对象",你可以随时修改它们的子节点,最后再按预期顺序插入到文档中。
针对代码示例的解释
你的写法完全可行:
- 先一次性创建
parta、partb、partc这类元素节点时,它们只是游离的节点,还不属于文档树的一部分 - 你可以任意顺序给这些节点添加子元素——比如先给
parta加内容,再给partb,之后回头给parta补加内容,甚至最后才给partc填充子节点都没问题 - 最后通过
appendChild()把这些节点按parta→partb→partc的顺序添加到文档中,输出XML时它们就会按这个顺序排列,子元素的顺序则是你调用appendChild()添加时的顺序
以下是完整可运行的验证示例:
<?php $inputa = "内容A"; $inputb = "内容B"; $inputc = "内容C"; $inputd = "补全的C内容"; $xml = new DOMDocument("1.0",'utf-8'); $xml->formatOutput=true; $rootxml = $xml->createElement("TDNS","root element"); $xml->appendChild($rootxml); // 先创建所有父元素 $parta=$xml->createElement("astuff"); $partb=$xml->createElement("bstuff"); $partc=$xml->createElement("cstuff"); // 随机顺序填充子元素 $infoa=$xml->createElement("info_a",$inputa); $parta->appendChild($infoa); $infoc=$xml->createElement("info_c",$inputc); $partb->appendChild($infoc); $infob=$xml->createElement("info_b",$inputb); $parta->appendChild($infob); // 最后才给partc加子元素 $infod=$xml->createElement("info_d",$inputd); $partc->appendChild($infod); // 按指定顺序加入文档 $xml->appendChild($parta); $xml->appendChild($partb); $xml->appendChild($partc); // 输出结果 echo htmlspecialchars($xml->saveXML()); ?>
输出的XML结构会是:
<?xml version="1.0" encoding="utf-8"?> <TDNS>root element</TDNS> <astuff> <info_a>内容A</info_a> <info_b>内容B</info_b> </astuff> <bstuff> <info_c>内容C</info_c> </bstuff> <cstuff> <info_d>补全的C内容</info_d> </cstuff>
关键原理
- DOMDocument采用节点树工作模式,而非线性缓冲区:每个
createElement()生成的是独立的DOMElement对象,只要还没加入文档树,你可以随时修改它的子节点、属性等 - 子元素的顺序由你调用
appendChild()添加到父元素的顺序决定;父元素在文档中的顺序由你把它们加入文档树的顺序决定 - 只有调用
saveXML()或save()时,才会把整个节点树序列化为XML文本,之前的操作都是在内存中操作节点对象
内容的提问来源于stack exchange,提问作者TekOps
相关产品推荐
相关产品推荐

