Karthik Malla
Karthik Malla

Reputation: 5800

XML file content not updating using PHP

Each time I run the code, file updates and I can see the file last edited date and time are updated but the content in the XML file is not updated.

I just tried to update the following XML Code

<?xml version="1.0" encoding="utf-8"?>
<topcont>
<sitenondualtraining>
<title>The Heart of Awakening</title>
<descripition>nondual</descripition>
<link>www.test.com/post/latestpost</link>
</sitenondualtraining>
</topcont>

using PHP code

$topcont = new DOMDocument();
$topcont->load("http://fenner.tk/topcont.xml");
$topcont->topcont->sitenondualtraining->title = 'test';
$topcont->sitenondualtraining->descripition = $_POST['nd2'];
$topcont->sitenondualtraining->link = $_POST['nd3'];
$topcont->Save("topcont.xml");

I also tried

$topcont = new SimpleXmlElement('http://fenner.tk/topcont.xml',null, true);
$topcont->sitenondualtraining->title = $_POST['nd1'];
$topcont->sitenondualtraining->descripition = $_POST['nd2'];
$topcont->sitenondualtraining->link = $_POST['nd3'];
$topcont->asXml('topcont.xml');

But none of these are working. Can anyone point where the issue is? Thanks.

File permission are set to 777 but still not working

NO ERRORS BUT WARNINGS ARE

Warning: Creating default object from empty value in /home/fenner/public_html/topads.php on line 20

Warning: Creating default object from empty value in /home/fenner/public_html/topads.php on line 21 /home/fenner/public_html/

Upvotes: 0

Views: 138

Answers (1)

stckrboy
stckrboy

Reputation: 379

Using DomDocument, you were almost there. You can do it like this:

$topcont = new DOMDocument();
$topcont->load("topcont.xml");


$topcont->getElementsByTagName("title")->item(0)->nodeValue = $_POST['nd2'];
$topcont->getElementsByTagName("description")->item(0)->nodeValue = $_POST['nd2'];
$topcont->getElementsByTagName("link")->item(0)->nodeValue = $_POST['nd3'];

$topcont->save("topcont.xml");

Just remember to sanitize your inputs before storing your data ;)

Also worth looking into is creating cdata sections and using replaceData, depending on what you intend to store in each node.

EDIT

In response to your comment below, you might want to change your xml structure a little if you are going to be handling multiple child nodes. This way it is easier to loop through and update the node you are interested in. You will see below that I moved 'sitenondualtraining' and 'siteradiantmind' to be id's of an 'item" node, though you could easily change this to something like <site id="nodualtraining> if that's more like what you were looking for.

<?xml version="1.0" encoding="utf-8"?>
<topcont>
    <item id="sitenondualtraining">
        <title>test</title>
        <description>hello test</description>
        <link>hello</link>
    </item>
    <item id="siteradiantmind">
        <title>The Heart of Awakening</title>
        <description>radiantmind</description>
        <link>www.radiantmind.com/post/latestpost</link>
    </item>
</topcont>

Your PHP code would then be something like this, again this is quite basic and could be tidied up, but is a good start:

$items = $topcont->getElementsByTagName("item");

// loop through each item
foreach ($items as $item) {
    $id = $item->getAttribute('id');

    // check the item id to make sure we edit the correct one
    if ($id == "sitenondualtraining") {
        $item->getElementsByTagName("title")->item(0)->nodeValue = $_POST['nd1'];
        $item->getElementsByTagName("link")->item(0)->nodeValue = $_POST['nd2'];
        $item->getElementsByTagName("description")->item(0)->nodeValue = $_POST['nd3];
    }
}

If you were feeling a little adventurous, you could have a look at xpath and xpath query, you can find some sample code in most php docs to get you started and the comments from other users can be helpful as well.

For reference: getAttribute, getElementsByTagName.

Upvotes: 1

Related Questions