Zusammenführen von XML-Dateien in PHP
Ich habe 2 Dateien1.xml
und2.xml
beide haben eine ähnliche Struktur und ich hätte gerne eine. Ich habe viele Lösungen ausprobiert, aber ich hatte nur Fehler - ehrlich gesagt habe ich keine Ahnung, wie diese Skripte funktionierten.
1.xml
:
<code><res> <items total="180"> <item> <id>1</id> <title>Title 1</title> <author>Author 1</author> </item> ... </items> </res> </code>
2.xml
:
<code><res> <items total="123"> <item> <id>190</id> <title>Title 190</title> <author>Author 190</author> </item> ... </items> </res> </code>
Ich möchte eine neue Datei erstellenmerged.xml
mit der folgenden Struktur
<code><res> <items total="303"> <item> <id>1</id> <title>Title 1</title> <author>Author 1</author> </item> ... //items from 1.xml <item> <id>190</id> <title>Title 190</title> <author>Author 190</author> </item> ... //items from 2.xml </items> </res> </code>
Wie soll ich das machen Kannst du mir den Weg dazu erklären? Wie kann ich das mit mehr Dateien machen? Vielen Dank
Bearbeiten
Was habe ich versucht?
<code><?php function mergeXML(&$base, $add) { if ( $add->count() != 0 ) $new = $base->addChild($add->getName()); else $new = $base->addChild($add->getName(), $add); foreach ($add->attributes() as $a => $b) { $new->addAttribute($a, $b); } if ( $add->count() != 0 ) { foreach ($add->children() as $child) { mergeXML($new, $child); } } } $xml = mergeXML(simplexml_load_file('1.xml'), simplexml_load_file('2.xml')); echo $xml->asXML(merged.xml); ?> </code>
EDIT2
Nach dem Rat von Torious habe ich in das DOMDocument-Handbuch geschaut und ein Beispiel gefunden:
<code>function joinXML($parent, $child, $tag = null) { $DOMChild = new DOMDocument; $DOMChild->load($child); $node = $DOMChild->documentElement; $DOMParent = new DOMDocument; $DOMParent->formatOutput = true; $DOMParent->load($parent); $node = $DOMParent->importNode($node, true); if ($tag !== null) { $tag = $DOMParent->getElementsByTagName($tag)->item(0); $tag->appendChild($node); } else { $DOMParent->documentElement->appendChild($node); } return $DOMParent->save('merged.xml'); } joinXML('1.xml', '2.xml') </code>
Aber es erstellt falsche XML-Datei:
<code><res> <items total="180"> <item> <id>1</id> <title>Title 1</title> <author>Author 1</author> </item> ... </items> <res> <items total="123"> <item> <id>190</id> <title>Title 190</title> <author>Author 190</author> </item> ... </items> </res> </res> </code>
Und ich kann diese Datei nicht richtig verwenden. Ich brauche die richtige Struktur und hier habe ich eine Art Einfügen einer Datei in eine andere. Ich möchte nur Artikel "einfügen", die nicht alle Tags sind. Was soll ich ändern?
EDIT3
hier ist eine antwort - basierend auf torious answer - nur an meine bedürfnisse angepasst - check // editiert
<code>$doc1 = new DOMDocument(); $doc1->load('1.xml'); $doc2 = new DOMDocument(); $doc2->load('2.xml'); // get 'res' element of document 1 $res1 = $doc1->getElementsByTagName('items')->item(0); //edited res - items // iterate over 'item' elements of document 2 $items2 = $doc2->getElementsByTagName('item'); for ($i = 0; $i < $items2->length; $i ++) { $item2 = $items2->item($i); // import/copy item from document 2 to document 1 $item1 = $doc1->importNode($item2, true); // append imported item to document 1 'res' element $res1->appendChild($item1); } $doc1->save('merged.xml'); //edited -added saving into xml file </code>