gpt4 book ai didi

php - 在 PHP 中合并 XML 文件

转载 作者:IT王子 更新时间:2023-10-29 00:08:16 26 4
gpt4 key购买 nike

我有 2 个文件 1.xml2.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 的建议,我查看了 DOMDocument 手册并找到了一个示例:

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 的答案 - 刚刚根据我的需要进行了调整 - 检查//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

最佳答案

既然你已经付出了努力,我已经编写了一些应该可以工作的代码。

请注意,这是未经测试的代码,但你明白了。

将它变成漂亮的函数取决于你。确保你了解发生了什么;能够使用 DOM 可能会在未来的许多场景中帮助您。 DOM 标准很酷的一点是,您可以在许多不同的编程语言/平台上进行几乎相同的操作。

    $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 - 在 PHP 中合并 XML 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10163675/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com