user2230111
user2230111

Reputation:

How do I rename XML values using php?

How do I rename a value in xml using PHP? This is what I've got so far:

<?php
$q = $_GET["q"];
$q = stripslashes($q);

$q = explode('|^', $q);

$old = $q[0];

$dom                     = new DOMDocument;
$dom->preserveWhiteSpace = false;
$dom->formatOutput       = true;

$dom->Load("test.xml");

$xpath   = new DOMXPath($dom);    
$query1  = 'channel/item[title="' . $old . '"]/title';
$entries = $xpath->query($query1);

foreach ($entries as $entry) 
{        
    $oldchapter = $entry->parentNode->removeChild($entry);

    $item       = $dom->getElementsByTagName('item');

    foreach ($item as $items) 
    {
        $title = $dom->createElement('title', $q[1]);            
        $items->appendChild($title);            
    }
}    

$dom->save("test.xml");

Basically, what it does is take two titles from a url, the old existing title, and the one the user wants to change it to (so like this oldtitle|^newtitle), and puts them into an array.

What I've tried doing is removing the existing old title, and then making a new title with, using the new title value from the url, but it doesn't seem to be working. Where am I going wrong, or is there an easier way of doing this?

Upvotes: 0

Views: 131

Answers (1)

DaveRandom
DaveRandom

Reputation: 88657

The way to do this is with DOMNode::replaceChild(). The majority of your code is correct, you've just slightly over-complicated some of the DOM stuff.

Try this:

<?php

    $q = $_GET["q"];
    $q = stripslashes($q);

    $q = explode('|^', $q);

    $old = $q[0];

    $dom                     = new DOMDocument;

    // Do this *before* loading the document
    $dom->preserveWhiteSpace = false;
    $dom->formatOutput       = true;

    $dom->Load("test.xml");
    $xpath = new DOMXPath($dom);

    $query1  = 'channel/item[title="' . $old . '"]/title';
    $entries = $xpath->query($query1);

    // This is all you need to do in the loop
    foreach ($entries as $oldTitle) {
        $newTitle = $dom->createElement('title', $q[1]);
        $entry->parentNode->replaceChild($newTitle, $oldTitle);
    }

    $dom->save("test.xml");

Upvotes: 1

Related Questions