Stanley Ngumo
Stanley Ngumo

Reputation: 4239

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

This is a sample of my XML document which shows a website sitemap

<?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>

I would like to use DOMDocument to add another element node above the one illustrated so that it appears as follows

<?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>

But from the DOMDocument documentation I cant seem to find even an example that shows me how the new element would be achieved.

The createElement and appendChild methods only show me how to insert the element node but not how to insert the remaining folder child nodes.

Upvotes: 1

Views: 1803

Answers (1)

Mohammad
Mohammad

Reputation: 21489

Select element tag and use 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();

See result in demo

Upvotes: 1

Related Questions