我有兩個文件1.xml
和2.xml
都具有相似的結構,我想有一個。我嘗試了很多解決方案,但我只有錯誤 - 坦率地說,我不知道這些腳本是如何工作的。在PHP中合併XML文件
1.xml
:
<res>
<items total="180">
<item>
<id>1</id>
<title>Title 1</title>
<author>Author 1</author>
</item>
...
</items>
</res>
2.xml
:
<res>
<items total="123">
<item>
<id>190</id>
<title>Title 190</title>
<author>Author 190</author>
</item>
...
</items>
</res>
我想創建一個新的文件merged.xml
結構如下
<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>
我應該怎麼辦呢?你能解釋一下嗎?我怎樣才能做到更多的文件?由於
編輯
我試過嗎?
<?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);
?>
EDIT2
繼Torious的意見,我看着DOM文檔手冊,發現了一個例子:
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')
但它會創建錯誤的XML文件:
<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>
我無法正確使用此文件。我需要正確的結構,在這裏我有一種粘貼到另一個文件。我想「粘貼」只是項目的不是所有的標籤。我應該改變什麼?
EDIT3
這裏是一個答案 - 基於Torious答案 - 只要它適合我的需要 - 檢查//編輯
$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
嘗試使用DOM,啓動[這裏](http://www.php.net/manual/en/domdocument.loadxml.php)。請注意,如果要合併XML文檔(來自不同的'DOMDocument'源,則必須在某個時間點使用'importNode'(大約) – Torious 2012-04-15 16:40:57