当前位置: 首页 > 面试题库 >

在PHP中合并XML文件

方恺
2023-03-14
问题内容

我有2个文件,1.xml并且2.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);
?>

编辑2

遵循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>

而且我无法正确使用此文件。我需要正确的结构,在这里我可以将一个文件粘贴到另一个文件中。我只想“粘贴”项目的所有标签。我应该改变什么?

编辑3

这是一个答案-基于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可能会在很多将来的场景中为您提供帮助。关于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);

    }


 类似资料:
  • 问题内容: 这里有些错误,似乎无法合并XML DOMDocumet,这是我收到的错误,“致命错误:在第27行的C:\ xampp \ htdocs \ xmltest\ xmltest.php中调用未定义的方法DOMElement :: importNode()”可以任何人都可以帮助我正确编写此代码… 问题答案: 是属于文档的方法,而不是元素。您要导入 文档 (),然后追加到 元素 ()。 导入时

  • 问题内容: 假设我的数据库中有以下两段XML 此数据使用数据类型存储在两个单独的表中,此外,此XML列链接到描述所需xml格式的模式,例如 在存储过程/函数中,我想将这两个XML结构合并为以下内容: 因此,从xml的第一部分开始,我们采取了以下措施: 从第二段xml中我们获得了以下内容: 注意,这两段XML有一个共同的项目,其关键是: 在这种情况下,应在合并的xml中使用xml 2中的值(丢弃xm

  • 问题内容: 在Linux Debian系统上使用PHP 5.2将几个MP3文件的内容合并为一个最简单的方法是什么?我找到了一些本应仅在PHP中执行的脚本,但它们似乎有问题。也许有一种方法可以使用命令行程序来完成此任务,而我可以将其安装在Linux Debian机器上? 问题答案: 检查以下内容:http : //lists.mplayerhq.hu/pipermail/ffmpeg- user/2

  • 问题内容: 我的概念是-网站中有10个pdf文件。用户可以选择一些pdf文件,然后选择合并以创建一个包含所选页面的pdf文件。我该如何用PHP做到这一点? 问题答案: 我以前做过 我有一个用fpdf生成的pdf,我需要在其中添加可变数量的PDF。 因此,我已经设置了fpdf对象和页面),并使用fpdi导入了文件通过扩展PDF类来添加FDPI: 基本上,这会将每个pdf转换为图像以放入您的其他pdf

  • 问题内容: 我正在尝试合并两个xml文件,如下所示,但我无法获得所需的输出,请帮助我,谢谢 Java代码: File1.xml File2.xml 电流输出: 预期产量: 问题答案: 为了自己做。您应该执行以下操作: testFinal.xml的最终输出: 如你所愿;-) 希望能帮助到你,

  • 我正在尝试合并两个xml文件,如下所示,但我无法获得所需的输出,请帮助我,谢谢 Java代码: 文件1.xml File2.xml 电流输出: 预期输出: