结合许多XML文件

时间:2011-05-06 19:58:43

标签: xml xslt merge

我可以使用哪种语言来组合多个XML文件。多个10个以上的文件。

PHP,java还是什么?

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

由于我不知道从哪里开始,文档会让人感到困惑。

总而言之,我需要有人指出我正确的方向。

有人请帮忙。我一直试图解决这个问题

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

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分: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的元素,将其用作root。 迭代每个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();
?>