4

this may sound pretty straight forward, but still I want to post this question in the forum. I have a xml file, which needs to be appended with data after the main element and save the xml file without overwriting the existing xml file but to append the data to already existing data and update the xml file.

For example my xml data looks something similar to this:

<maincontent>
    <headercontent>
        <product num="2102">
            <name>MSG</name>
            <category>Wellness</category>
            <available content="YES"></available>
        </product>
        <product num="2101">
            <name>YSD</name>
            <category>Music</category>
            <available content="NO"></available>
        </product>
        <product num="2100">
            <name>RCS</name>
            <category>Media</category>
            <available content="YES"></available>
        </product>
    </headercontent>
</maincontent>

I want to add another product with all the info and append the newly added data at the top so that the newly added data should come after the headercontent.

Data to be added:

        <product num="2103">
            <name>AGB</name>
            <category>Movies</category>
            <available content="YES"></available>
        </product>

The updated xml file should be looking like this as shown below:

<maincontent>
    <headercontent>
        <product num="2103">
                <name>AGB</name>
                <category>Movies</category>
                <available content="YES"></available>
    </product>
        <product num="2102">
            <name>MSG</name>
            <category>Wellness</category>
            <available content="YES"></available>
        </product>
        <product num="2101">
            <name>YSD</name>
            <category>Music</category>
            <available content="NO"></available>
        </product>
        <product num="2100">
            <name>RCS</name>
            <category>Media</category>
            <available content="YES"></available>
        </product>
    </headercontent>
</maincontent>

Any useful advice or a piece of example code would be really helpful.

Edit:

sorry guys I haven't posted any php code, my fault. Here is the code which I have been working on:

Thanks

<?php

 $xmldoc = new DomDocument();    
    $xmldoc->formatOutput = true;

    $productNum = "2103";
    $name = "AGB";
    $category = "Movies";
    $content = "YES";

    if($xml = file_get_contents('main.xml')){
        $xmldoc->loadXML($xml);

        $root = $xmldoc->firstChild;        

        $newElement = $xmldoc->createElement('product');
        $root->appendChild($newElement);
        $numAttribute = $xmldoc->createAttribute("num");
        $numAttribute->value = $productNum;
        $newElement->appendChild($numAttribute);   

        $nameElement = $xmldoc->createElement('name');
        $root->appendChild($nameElement);
        $nameText = $xmldoc->createTextNode($name);
        $nameElement->appendChild($nameText);

        $categoryElement = $xmldoc->createElement('category');
        $root->appendChild($categoryElement);
        $categoryText = $xmldoc->createTextNode($category);
        $categoryElement->appendChild($categoryText);

        $availableElement = $xmldoc->createElement('available');
        $root->appendChild($availableElement);
        $availableAttribute = $xmldoc->createAttribute("content");
        $availableAttribute->value = $content;
        $availableElement->appendChild($availableAttribute);   


        $xmldoc->save('main.xml');
    }
?>

My xml file gets updated but the data is added to the firstchild and that too at the bottom, instead I want to add data after and in the beginning as shown above. Here is my output:

<maincontent>
    <headercontent>
        <product num="2102">
            <name>MSG</name>
            <category>Wellness</category>
            <available content="YES"/>
        </product>
        <product num="2101">
            <name>YSD</name>
            <category>Music</category>
            <available content="NO"/>
        </product>
        <product num="2100">
            <name>RCS</name>
            <category>Media</category>
            <available content="YES"/>
        </product>
    </headercontent>
<product num="2103"/><name>AGB</name><category>Movies</category><available content="YES"/></maincontent>

Any advice?

3
  • what have you tried so far? No one here is gonna help you if you don't show some effort from your side. Commented Jun 13, 2012 at 10:22
  • possible duplicate http://stackoverflow.com/questions/194574/inserting-data-in-xml-file-with-php-dom Commented Jun 13, 2012 at 10:37
  • I have updated the post, any replies! Commented Jun 14, 2012 at 9:54

1 Answer 1

11

This will work.

<?php
$xmldoc = new DomDocument( '1.0' );
$xmldoc->preserveWhiteSpace = false;
$xmldoc->formatOutput = true;

$productNum = "2103";
$name = "AGB";
$category = "Movies";
$content = "YES";

if( $xml = file_get_contents( 'main.xml') ) {
    $xmldoc->loadXML( $xml, LIBXML_NOBLANKS );

    // find the headercontent tag
    $root = $xmldoc->getElementsByTagName('headercontent')->item(0);

    // create the <product> tag
    $product = $xmldoc->createElement('product');
    $numAttribute = $xmldoc->createAttribute("num");
    $numAttribute->value = $productNum;
    $product->appendChild($numAttribute);

    // add the product tag before the first element in the <headercontent> tag
    $root->insertBefore( $product, $root->firstChild );

    // create other elements and add it to the <product> tag.
    $nameElement = $xmldoc->createElement('name');
    $product->appendChild($nameElement);
    $nameText = $xmldoc->createTextNode($name);
    $nameElement->appendChild($nameText);

    $categoryElement = $xmldoc->createElement('category');
    $product->appendChild($categoryElement);
    $categoryText = $xmldoc->createTextNode($category);
    $categoryElement->appendChild($categoryText);

    $availableElement = $xmldoc->createElement('available');
    $product->appendChild($availableElement);
    $availableAttribute = $xmldoc->createAttribute("content");
    $availableAttribute->value = $content;
    $availableElement->appendChild($availableAttribute);

    $xmldoc->save('main.xml');
}
?>

Hope this helps.

Sign up to request clarification or add additional context in comments.

1 Comment

happy to help. You were already doing the hard work, all i had to do was to modify it in two places ;)

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.