SUMMARY
- Load existing XML-File
- Add 2 items to every child
- Change order of children
- Write new XML-File
DETAILED EXPLANATION
This is a shortened sample of the Source-XML-File
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<warehouse>
<inventory>
<name>Name 1</name>
<markers>
<marker>red</marker>
<marker>yellow</marker>
<marker>green</marker>
</markers>
(...)
</inventory>
<inventory>
<name>Name 2</name>
<markers>
<marker>blue</marker>
<marker>pink</marker>
<marker>brown</marker>
</markers>
(...)
</inventory>
<inventory>
<name>Name 3</name>
<markers>
<marker>black</marker>
<marker>white</marker>
<marker>marron</marker>
</markers>
(...)
</inventory>
</warehouse>
1. Load existing XML-File
Load the XML-File into a variable.
$source_xmlfile = "source.xml";
$source_xml_file_contents = simplexml_load_file($source_xmlfile);
2. Add 2 items to every child
Add 2 children to the first inventory with name and value.
$source_xml_file_contents->warehouse->inventory[0]->addChild("new1", "0.12345");
$source_xml_file_contents->warehouse->inventory[0]->addChild("new2", "17");
3. Change order of children
This is the part that doesn't work for me, no matter what I tried.
My idea was the following:
$destination_xml_file_contents = new SimpleXMLElement('<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?><warehouse></warehouse>');
foreach($source_xml_file_contents->warehouse->inventory as $inventory){
$destination_xml_file_contents->warehouse->addChild("inventory", $inventory);
}
The basic idea is that I take a child (<inventory>) out of <warehouse> and store in in a variable or maybe an array (which would be way better and easier) containing everything that <inventory> contains (including attributes and child nodes and so on). After I have stored all <inventory> somewhere else I take a new XML and put the stored <inventory> in a new order into the new XML.
However it seems impossible to save a whole child into a variable (or an array) and add it to another XML later.
Since the order is not necessarily in order a simple sort wouldn't help me out here and since I wasn't able to get sorting to work I am at a loss here.
4. Write new XML-File
Save the new XML content to a new XML-File.
$new_xml_file = "destination.xml";
$destination_xml_file_contents->asXML($new_xml_file);
This is a shortened sample of the destination-XML-File
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<warehouse>
<inventory>
<name>Name 2</name>
<markers>
<marker>blue</marker>
<marker>pink</marker>
</marker>brown</marker>
</markers>
(...)
<new1>0.6789</new1>
<new2>115</new2>
</inventory>
<inventory>
<name>Name 1</name>
<markers>
<marker>red</marker>
<marker>yellow</marker>
</marker>green</marker>
</markers>
(...)
<new1>0.4567</new1>
<new2>4</new2>
</inventory>
<inventory>
<name>Name 3</name>
<markers>
<marker>black</marker>
<marker>white</marker>
</marker>marron</marker>
</markers>
(...)
<new1>0.1234</new1>
<new2>17</new2>
</inventory>
</warehouse>
Can someone help me to figure out how to make this work?
Right now I'm resorting to parse the whole XML-File and rewrite it line by line with string since SimpleXML doesn't seem to work.