Объединить XML-файлы в PHP
У меня 2 файла1.xml
а также2.xml
оба имеют похожую структуру, и я хотел бы иметь одну. Я перепробовал много решений, но у меня были только ошибки - честно говоря, я понятия не имею, как эти сценарии работали.
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>
Я хотел бы создать новый файлmerged.xml
со следующей структурой
<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>
Как мне это сделать? Можете ли вы объяснить мне, как это сделать? Как я могу сделать это с большим количеством файлов? Спасибо
Edit
Что я пробовал?
<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
Следуя совету Torious, я заглянул в руководство по DOMDocument и нашел пример:
<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>
Но это создает неправильный файл XML:
<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>
И я не могу использовать этот файл должным образом. Мне нужна правильная структура, и здесь у меня есть вид вставки одного файла в другой. Я хотел бы "вставить" только элементы, а не все теги. Что я должен изменить?
EDIT3
вот ответ - основанный на ответе Torious - просто адаптировал его к моим потребностям - проверьте // отредактировано
<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>