How do I add new elements to XML using PHP DOM deeper than the root?

13,855

adding content to an XML file at the document root, but I really need to do it deeper than that.

You're not adding content anywhere at the moment! You create <title> and <link> element nodes with text in, then you do nothing with them. You should be passing them into ‘appendChild’ on the <item> element node (which also you are currently creating and immediately throwing away by not assigning it to a variable).

Here's a starting-point:

$screenshots= $dom->getElementsByTagName("screenshots")[0];

$title= $dom->createElement("title");
$title->appendChild($dom->createTextNode($newshottitle));
$item= $dom->createElement("item");
$item->appendChild($title);
$screenshots->appendChild($item);
Share:
13,855
FishFingers
Author by

FishFingers

Updated on June 04, 2022

Comments

  • FishFingers
    FishFingers almost 2 years

    All of the examples I can find online about this involve simply adding content to an XML file at the document root, but I really need to do it deeper than that.

    My XML file is simple, I have:

    <?xml v1 etc>
    <channel>
    <screenshots>
    <item>
      <title>Image Title</title>
      <link>www.link.com/image.jpg</link>
    </item>
    </screenshots>
    </channel>
    

    All I want to be able to do is add new "item" elements, each with a title and link. I know I need to be using PHP DOM, but I'm stumped as to how to code it so that it adds data within "screenshots" rather than overwriting the whole document. I have a suspicion I may need to use XPath too, but I have no idea how!

    The code I have pieced together from online examples looks like this (but I'm certain it's wrong)

    $newshottitle = "My new screenshot";
    $newshotlink = "http://www.image.com/image.jpg";
    
    $dom = newDomDocument;
    $dom->formatOutput = true;
    $dom->load("../xml/screenshots.xml");
    
    $dom->getElementsByTagName("screenshots");
    $t = $dom->createElement("item");
    $t = $dom->createElement("title");
    $t->appendChild($dom->createTextNode("$newshottitle"));
    
    $l = $dom->createElement("link");
    $l->appendChild($dom->createTextNode("$newshotlink"));
    
    $dom->save("../xml/screenshots.xml");