在PHP中合并XML文件 [英] Merge XML files in PHP
问题描述
我有2个文件1.xml
和2.xml
都具有相似的结构,我想拥有一个.我尝试了许多解决方案,但只有错误-坦白地说,我不知道这些脚本是如何工作的.
I have 2 files 1.xml
and 2.xml
both having similar structure and I would like to have one. I tried many solutions but I had errors only - frankly speaking I have no idea how those scripts worked.
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
I would like to create a new file merged.xml
with the following structure
<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>
我该怎么做?你能给我解释一下方法吗?如何处理更多文件?谢谢
How should I do that? Can you explain me the way to do it? How can I do it with more files? Thanks
修改
我尝试了什么?
<?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的建议,我查看了DOMDocument手册,并找到了一个示例:
Following Torious advice I looked into DOMDocument manual and found an example:
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文件:
But it creates wrong xml file:
<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>
我无法正确使用此文件.我需要正确的结构,在这里我可以将一个文件粘贴到另一个文件中.我只想粘贴"项目的所有标签.我应该改变什么?
And I cannot use this file properly. I need correct structure and here I have kind of pasting one file into another. I would like to "paste" only item's not all tags. What should I change?
EDIT3
这是一个答案-基于Torious的答案-使其适应了我的需要-检查//已编辑
here is an answer - based on Torious answer - just adapted it to my needs - check //edited
$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
推荐答案
由于您付出了很大的努力,我编写了一些行之有效的代码.
Since you've put an effort in, I've coded something that should work.
请注意,这是未经测试的代码,但是您可以理解.
由您决定是否使其具有漂亮的功能.确保您了解发生了什么事;能够使用DOM可能会在很多将来的场景中为您提供帮助.关于DOM标准的很酷的事情是,您可以在许多不同的编程语言/平台中执行几乎相同的操作.
It's up to you to make it into pretty functions. Make sure you understand what's going on; being able to work with the DOM will probably help you out in a lot of future scenarios. The cool thing about the DOM standard is that you have pretty much the same operations in many different programming languages/platforms.
$doc1 = new DOMDocument();
$doc1->load('1.xml');
$doc2 = new DOMDocument();
$doc2->load('2.xml');
// get 'res' element of document 1
$res1 = $doc1->getElementsByTagName('res')->item(0);
// 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);
}
这篇关于在PHP中合并XML文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!