3

How can I set attributes when I add new elements in XML with PHP. My PHP code is like this:

 <?php
     $xml = simplexml_load_file ( 'log.xml' );

     $movies = $xml->addChild("time");
      // add attribut `value` here in tag time

     $user = $movies->addChild("user", "");
     // add attribut `id` here in tag user

     $action = $user->addChild("action","");
     // add attribut `value` here in tag action

     $action->addChild("table","customers");

     $action->addChild("table_id","1");

     echo $xml->saveXML( 'log.xml' );
 ?>

And I want output to look like this:

// log.xml
<?xml version="1.0" encoding="utf-8"?>
<log>
<time value="2013-01-10 12:20:01">
    <user id="1">
        <action value="delete">
            <table>customer</table>
            <table_id>1</table_id>
        </action>   
        <action value="insert">
            <table>customer</table>
            <data>
                <nama>budi</nama>
            </data>
        </action>
        <action value="update">
            <table>customer</table>
            <table_id>1</table_id>
            <old_data>
                <nama>andi</nama>
            </old_data>
            <new_data>
                <nama>budi</nama>
            </new_data>
        </action>
    </user>
</time>
</log>

please help me..i am very new about xml

3 Answers 3

7

Use SimpleXMLElement::addAttribute — Adds an attribute to the SimpleXML element

edit: Your use case -

     $action = $user->addChild("action","");
     // add attribut `value` here in tag action
     $action->addAttribute('value','update'); // add this

     $action->addChild("table","customers");

     $action->addChild("table_id","1");

Best example:

http://php.net/manual/en/simplexmlelement.addattribute.php

<?php

include 'example.php';

$sxe = new SimpleXMLElement($xmlstr);
$sxe->addAttribute('type', 'documentary');

$movie = $sxe->addChild('movie');
$movie->addChild('title', 'PHP2: More Parser Stories');
$movie->addChild('plot', 'This is all about the people who make it work.');

$characters = $movie->addChild('characters');
$character  = $characters->addChild('character');
$character->addChild('name', 'Mr. Parser');
$character->addChild('actor', 'John Doe');

$rating = $movie->addChild('rating', '5');
$rating->addAttribute('type', 'stars');

echo $sxe->asXML();

?>

Credits to first example in PHP.Net ref page...

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

2 Comments

what is "include 'example.php';" used for?
Usually to include another php script. In this case imagine that example.php contains a string value assigned to $xmlstr.
1

Use addAttribute()

$movies->addAttribute('value','your value here');
$action->addAttribute('value','your value here');
$user->addAttribute('id','your value here');

Comments

1

Spent three hours to combine SimpleXML with other solutions and finally get this. It works and I hope it will be useful.

$xml_data = new SimpleXMLElement('<?xml version="1.0"?><data></data>');

$arrXml = [
    "categories" => [
        'category' => [
            '@attributes' => [
                'id' => '123',
                'parent_id' => '12345'
            ],
            '@value' => 'Bikes'
        ]
    ],
    "properties" => [
        'property' => [
            'id' => '123',
            'categoryId' => '1',
            'name' => 'Color',
            'values' => [
                'value' => [
                    "id" => '1',
                    "name" => 'Black'
                ],
                'value' => [
                    "id" => '2',
                    "name" => 'White'
                ]
            ]
        ]
    ],
    "products" => [
        'products' => [
            'id' => '1231231',
            'categoryId' => '123',
            'model' => [
                    '@attributes' => [
                            'foo' => 'bar',
                    ],
                '@value' => 'Avalanche'
            ],
            'article' => '1.0 2011',
            'vendor' => 'GT',
        ]
    ]
];

array_to_xml($arrXml,$xml_data);

//saving generated xml file;
$result = $xml_data->asXML('test.xml');

// print $xml_data->asXML();

goes to the

<data>
<categories>
    <category id="123" parent_id="12345">Bikes</category>
</categories>
<properties>
    <property>
        <id>123</id>
        <categoryId>1</categoryId>
        <name>Color</name>
        <values>
            <value>
                <id>2</id>
                <name>White</name>
            </value>
        </values>
    </property>
</properties>
<products>
    <products>
        <id>1231231</id>
        <categoryId>123</categoryId>
        <category foo="bar">Avalanche</category>
        <article>1.0 2011</article>
        <vendor>GT</vendor>
    </products>
</products>

with this function:

function array_to_xml( $data, &$xml_data ) {
        foreach( $data as $key => $value ) {
            if (!empty($value)) {
                if( is_array($value)) {
                    if (!empty($value["@attributes"])) {
                            $subnode = $xml_data->addChild($key, $value["@value"]);
                            foreach ($value["@attributes"] as $key1 => $val1) {
                                $subnode->addAttribute($key1, $val1);
                            }
                    } else if ($key == "@value") {
                        foreach ($value as $attr => $attrVal) {
                            $subnode = $xml_data->addChild("$attr", $attrVal);
                            array_to_xml($attrVal, $subnode);
                        }
                    } else {
                            if (!empty($value)) {
                                    $subnode = $xml_data->addChild($key);
                                    array_to_xml($value, $subnode);
                            }
                    }
                } else {
                        $xml_data->addChild("$key",$value);
                }
            }
        }
    }

Comments

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.