Fusionar archivos XML en PHP
Tengo 2 archivos1.xml
y2.xml
Ambos tienen una estructura similar y me gustaría tener uno. Probé muchas soluciones, pero solo tuve errores; francamente, no tengo idea de cómo funcionaron esos scripts.
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>
Me gustaría crear un nuevo archivomerged.xml
con la siguiente estructura
<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>
¿Cómo debo hacer eso? ¿Me puedes explicar cómo hacerlo? ¿Cómo puedo hacerlo con más archivos? Gracias
Editar
¿Qué intenté?
<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
Siguiendo el consejo de Torious, miré el manual de DOMDocument y encontré un ejemplo:
<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>
Pero crea un archivo xml incorrecto:
<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>
Y no puedo usar este archivo correctamente. Necesito la estructura correcta y aquí tengo una especie de pegar un archivo en otro. Me gustaría "pegar" solo el artículo no todas las etiquetas. ¿Qué debo cambiar?
EDITAR3
Aquí hay una respuesta, basada en la respuesta de Torious, simplemente adaptada a mis necesidades, check // editado
<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>