使用 DOMDocument 将新节点及其子节点添加到 XML 文档

Adding new node and its child nodes to XML document using DOMDocument

这是我的 XML 文档的示例,其中显示了网站站点地图

<?xml version="1.0" encoding="UTF-8"?>
<project name="Esurance 365 Portal">
    <elements>
        <element name="folderone" path="forms/folderone">
            <folder function="model">models</folder>
            <folder function="controller">controllers</folder>
            <folder function="view">views</folder>
        </element>
    </elements>
</project>

我想使用DOMDocument在图示的元素节点上方添加另一个元素节点,使其显示如下

<?xml version="1.0" encoding="UTF-8"?>
    <project name="Esurance 365 Portal">
        <elements>
           <element name="foldertwo" path="forms/foldertwo">
                <folder function="model">modelstwo</folder>
                <folder function="controller">controllerstwo</folder>
                <folder function="view">viewstwo</folder>
            </element>
            <element name="folderone" path="forms/folderone">
                <folder function="model">models</folder>
                <folder function="controller">controllers</folder>
                <folder function="view">views</folder>
            </element>
        </elements>
    </project>

但是从 DOMDocument 文档中我似乎找不到一个示例来说明如何实现新元素。

createElementappendChild方法只告诉我如何插入元素节点,但没有告诉我如何插入剩余的文件夹子节点。

Select element 标记并使用 cloneNode() to copying it. Using setAttribute() set new value of attribute and using nodeValue set new text in target tag. At the end of code, insert new element before existing element using insertBefore().

$dom = new DOMDocument();
$dom->loadXml($xml);
// select "element" tag and copy it
$element = $dom->getElementsByTagName("element")->item(0);
$clone = $element->cloneNode(true);
// change value of attribute 
$clone->setAttribute("name", "foldertwo");
$clone->setAttribute("path", "forms/foldertwo");
// select "folder" tag in new "element" tag change text of them
$folder = $clone->getElementsByTagName("folder");
$folder->item(0)->nodeValue = "modelstwo";
$folder->item(1)->nodeValue = "controllerstwo";
$folder->item(2)->nodeValue = "viewstwo";
// insert new elements before existing element.
$element->parentNode->insertBefore($clone, $element);
$xml = $dom->saveXml();

结果见demo