0

I want to replace innertext of a XML node my XML file named test.xml is

<?xml version="1.0" encoding="utf-8"?>
<ads>
    <loop>no</loop>
    <item>
        <description>Description 1</description>
    </item>
    <item>
        <description>Text in item2</description>
    </item>
    <item>
        <description>Let play with this XML</description>
    </item>
</ads>

I want to change the value of loop and description tag both, and it should be saved in test.xml like:

<?xml version="1.0" encoding="utf-8"?>
<ads>
    <loop>yes</loop>
    <item>
        <description>Description Changing Here</description>
    </item>
    <item>
        <description>Changing text in item2</description>
    </item>
    <item>
        <description>We will play later</description>
    </item>
</ads>

I tried code in PHP:

<?
    $file = "test.xml";
    $fp = fopen($file, "rb") or die("cannot open file");
    $str = fread($fp, filesize($file));
    $dom=new DOMDocument();
    $dom->formatOutput = true;
    $dom->preserveWhiteSpace = false;
    $dom->loadXML($str) or die("Error");
    //$dom->load("items.xml");

    $root=$dom->documentElement; // This can differ (I am not sure, it can be only documentElement or documentElement->firstChild or only firstChild)

    $loop=$root->getElementsByTagName('loop')->item(0);//->textContent;
    //echo $loop;
    if(trim($loop->textContent)=='no')
    {
        echo 'ok';
        $root->getElementsByTagName('loop')->item(0)->nodeValue ='yes';
    }
    echo "<xmp>NEW:\n". $dom->saveXML() ."</xmp>";
?>

I tried only for loop tag.I don't know how to replace nodevalue in description tag. When I run this page it shows output like:

ok
NEW:
<?xml version="1.0" encoding="utf-8"?>
<ads>
    <loop>yes</loop>
    <item>
        <description>Description 1</description>
    </item>
    <item>
        <description>Changing text in item2</description>
    </item>
    <item>
        <description>Let play with this XML</description>
    </item>
</ads>

It gives the value yes in browser but don't save it in test.xml any reason?

1 Answer 1

1

So, since you have created DOMDocument you can use DOMXpath. Or keep using getElementsByTagName()

You could do this (but only in that context):

$descriptions = $root->getElementsByTagName('description');
foreach($descriptions as $nodeDesciption)
{
    $nodeDesciption->nodeValue ='Your custom value';
}
Sign up to request clarification or add additional context in comments.

2 Comments

This code will update same text in each and every description tag but I don't want this, I want different values in each description tag as shown in my output.
@RohanKumar obviously you need to add your own logic into foreach block. You have access to node (that also includes access to attributes, siblings, parents etc) so you can modify it in the way you need it to be modified.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.