我有几百个XML文件,每个文件大小为2kb,因此它们很小,但我需要将它们全部合并为一个,因为我需要使用我拥有的数据库来交换它们中的信息。
每个文件都包含一个特定的案例编号以及其他非重要的内容。
有什么方法可以将所有这些文件合并到一个xml文件中,并在每个文件中排除除Case Number: 123456
之外的所有不需要的信息?
答案 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。