合并xml文件

时间:2010-08-03 13:54:58

标签: xml

我有几百个XML文件,每个文件大小为2kb,因此它们很小,但我需要将它们全部合并为一个,因为我需要使用我拥有的数据库来交换它们中的信息。

每个文件都包含一个特定的案例编号以及其他非重要的内容。

有什么方法可以将所有这些文件合并到一个xml文件中,并在每个文件中排除除Case Number: 123456之外的所有不需要的信息?

1 个答案:

答案 0 :(得分:0)

如果我正确地阅读了这个问题,你想要将案例编号为“123456”的所有xml文件合并到一个XML文件中,对吗?

如果是这样,您可以使用XSLT或XQuery中的collection()函数指向包含XML文件的目录。

以下是我放入“C:\ test_xml”目录的3个测试XML文件。其中两个有“123456”案例编号,其中一个没有:

文件1:

<?xml version="1.0" encoding="UTF-8"?>
<doc>
    <case>123456</case>
    <blah>test 1 file</blah>
</doc>

文件2:

<?xml version="1.0" encoding="UTF-8"?>
<doc>
    <case>abcdef</case>
    <blah>test 2 file</blah>
</doc>

文件3:

<?xml version="1.0" encoding="UTF-8"?>
<doc>
    <case>123456</case>
    <blah>test 3 file</blah>
</doc>

使用 下面的XSLT或XQuery:

<强> XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="/">
        <collection>
            <xsl:for-each select="collection('file:///C:/test_xml?*.xml')/doc[case='123456']">
                <xsl:copy>
                    <xsl:apply-templates select="node()|@*"/>
                </xsl:copy>
            </xsl:for-each>
        </collection>
    </xsl:template>

</xsl:stylesheet>

<强>的XQuery:

<collection>
{
for $file in collection('file:///C:/test_xml?*.xml')/doc[case='123456']
return
    $file
}
</collection>

产生以下输出:

<强>输出:

<?xml version="1.0" encoding="UTF-8"?>
<collection>
   <doc>
      <case>123456</case>
      <blah>test 1 file</blah>
   </doc>
   <doc>
      <case>123456</case>
      <blah>test 3 file</blah>
   </doc>
</collection>

我使用Saxon-HE(免费家庭版)进行处理。此外,XQuery比XSLT快约8ms。