合并多个XML文件

4

我想合并多个XML文件,大约有10个以上。需要用什么语言实现呢?是PHP、Java还是其他语言?

我尝试使用XSLT,但不知道是否需要像Saxon这样的“处理器”。

文档对我来说太复杂了,我不知道从哪里开始。

总之,我需要有人指点我正确的方向。

请帮帮我,我已经试了好几天都没弄明白。

<xml version="1.0">
<products>
<price>Price List Here</price>
<model>Model Number Here</model>
</product>

好问题,+1。请看我的答案,其中包含完整、简短、易懂的纯 XSLT 解决方案。 :) - Dimitre Novatchev
2个回答

7

这可以很容易地在纯XSLT中完成

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:param name="pdoc1Url" select="'doc1.xml'"/>
 <xsl:param name="pdoc2Url" select="'doc2.xml'"/>

 <xsl:template match="/">
  <documents>
    <xsl:copy-of select="document($pdoc1Url)"/>
    <xsl:copy-of select="document($pdoc2Url)"/>
  </documents>
 </xsl:template>
</xsl:stylesheet>

上面的代码处理了两个XML文档,但可以扩展为处理任何预先知道数量的XML文档。 说明
  1. 将XML文档的URL作为全局/外部参数传递到转换中。
  2. 使用标准的XSLT函数document()

谢谢您的帮助。现在,我只需要在浏览器中执行这个文件吗?请原谅我对XSLT的理解不足。 - Ryan
1
你应该说出你需要在浏览器中执行转换。通常情况下,这是通过JavaScript代码在页面加载或其他适当的事件上完成的。此外,如果URL引用本地文件系统中的文件,则很可能不会授予访问文件的权限--无论使用哪种编程语言都是如此。至于如何将外部参数传递给转换,这对于不同的XSLT处理器是不同的。人们必须阅读他们正在使用的XSLT处理器的文档,以了解如何传递外部参数。 - Dimitre Novatchev

2
您可以使用任何允许您直接操作xml的语言。建议使用具有DOM而非SAX的语言。如果使用SAX,您基本上必须自己遍历xml-根据我的经验会很麻烦。DOM使您能够以更OOP的方式处理xml。
脱颖而出的一些东西可能会是在您的xml“文档”周围包装一个xml。所以就像这样:
<documents>
   <document>
      <!-- Your xml here -->
   </document>
   <document>
      <!-- Your xml here -->
   </document>
   <document>
      <!-- Your xml here -->
   </document>
</documents>

伪代码如下: 创建一个文档根。 添加一个名为documents的元素,将其用作根。 迭代每个xml文件。 对于每个文件,创建一个名为document的新元素。将该元素添加到父元素中。从文件中加载xml。将该节点导入到外部文档中。将导入的节点附加到文档元素的子集合中。
编辑 如承诺所述,这是经过测试并且可行的更新代码:
<?php

    // Replace the strings below with the actual filenames, add or decrease as fit
    $filenames = array(0 => "test.xml", 1 => "test2.xml", 2 => "test3.xml" );

    $docList = new DOMDocument();

    $root = $docList->createElement('documents');
    $docList->appendChild($root);

    foreach($filenames as $filename) {

        $doc = new DOMDocument();
        $doc->load($filename);

        $xmlString = $doc->saveXML($doc->documentElement);

        $xpath = new DOMXPath($doc);
        $query = "//product";  // this is the name of the ROOT element

        $nodelist = $xpath->evaluate($query, $doc->documentElement);

        if( $nodelist->length > 0 ) {

            $node = $docList->importNode($nodelist->item(0), true);

            $xmldownload = $docList->createElement('document');
            $xmldownload->setAttribute("filename", $filename);
            $xmldownload->appendChild($node);

            $root->appendChild($xmldownload);
        }

    }

    echo $docList->saveXML();
?>

1
@RPM 我觉得你的 XML 被格式化程序搞乱了。试着选中它,然后点击代码按钮——那个看起来像“{}”的按钮。 - SRM
1
只要它们都是有效的XML标记,@RPM就不会有问题。 - SRM
1
根据您的XML更新了@RPM(根元素名称最为重要)。那段代码应该适合你使用。 - SRM
1
@RPM 那是因为我写了一个BUG :). 对 $xmlarray[your_index] 的赋值是不正确的。现在看一下,我已经进行了编辑。 - SRM
1
@RPM 两个 bug!哇,我应该先测试一下的,对此感到抱歉。但是现在我不方便进行测试。如果你还在苦苦挣扎,今晚我回家后会确保发布一个可行的解决方案。对于造成的困惑,再次道歉。 - SRM
显示剩余14条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接