在输入中,我有xml文件(可以是1000或100000个文件),我必须将其转换为6个csv文件,以便以后保存到数据库中。我的问题是如何在Java中更有效地执行此操作,现在我用不同的xslt样式表创建6个转换器,并手动将xml转换6次。我尝试在一个具有功能的xslt转换中执行此操作:结果文档,它可以工作,但是在输入中可能有多个xml文件,并且在重写结果文件中的每个转换数据之后。我的想法是从csv中的xml文件中收集所有数据,然后将其复制到db表中。
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTemplates(stylesource).newTransformer();
Transformer transformer2 = tf.newTemplates(stylesource2).newTransformer();
Transformer transformer3 = tf.newTemplates(stylesource3).newTransformer();
Transformer transformer4 = tf.newTemplates(stylesource4).newTransformer();
Transformer transformer5 = tf.newTemplates(stylesource5).newTransformer();
Transformer transformer6 = tf.newTemplates(stylesource6).newTransformer();
DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
public void transformXmlToCsv(String content) throws TransformerException, IOException, SAXException {
Document doc = db.parse(new InputSource(new StringReader(content)));
Source source = new DOMSource(doc);
transformer.transform(source, outputTarget);
transformer2.transform(source, outputTarget2);
transformer3.transform(source, outputTarget3);
transformer4.transform(source, outputTarget4);
transformer5.transform(source, outputTarget5);
transformer6.transform(source, outputTarget6);
}
您可以做的一项改进是,通过一次构建输入树来避免重复分析源文档。例如,通过构建DOM树并使用DOMSource
,或者(如果使用Saxon,则更好)是使用Saxon接口以Saxon的内部格式构建树。
另一种改进是为所有内容仅创建一个TransformerFactory
。创建一个TransformerFactory
通常很昂贵(它涉及对类路径的搜索),并且不需要创建多个。
使用xsl:result-document
解决问题应该很容易。有很多方法可以做到这一点,例如通过将每个转换的输出定向到不同的目录,但是如果没有更多信息,我无法确定最好的方法是什么。