我有一个简单的转换XML代码,但它非常耗时(我必须重复多次)。有没有人建议如何优化此代码?感谢。
编辑:这是代码的新版本。我不幸地无法重用Transformer
,因为XSLTRule
在大多数情况下是不同的。我现在正在重用TransformerFactory
。我之前没有读取文件,因此我无法使用StreamSource
。花在初始化Transformer
上的时间最长。
private static TransformerFactory tFactory = TransformerFactory.newInstance();
public static String transform(String XML, String XSLTRule) throws TransformerException {
Source xmlInput = new StreamSource(new StringReader(XML));
Source xslInput = new StreamSource(new StringReader(XSLTRule));
Transformer transformer = tFactory.newTransformer(xslInput);
StringWriter resultWriter = new StringWriter();
Result result = new StreamResult(resultWriter);
transformer.transform(xmlInput, result);
return resultWriter.toString();
}
答案 0 :(得分:3)
您应该做的第一件事是跳过不必要的XML字符串转换为字节(特别是使用硬编码,可能不正确的编码)。您可以使用StringReader
并将其传递给StreamSource
构造函数。结果相同:使用StringWriter
并避免转换。
当然,如果您在首先将XML从文件(字节)转换为String
之后调用该方法(再次使用可能错误的编码),那么拥有{会更好{1}}直接从文件中读取。
答案 1 :(得分:1)
您似乎将XSLT应用于XML文件。为了加快速度,您可以尝试编译XSLT,就像XSLTC一样。
答案 2 :(得分:0)
我只能想到几件小事:
可以重复使用TransformerFactory。
如果线程受限,则可以重用Transformer,每次XSL输入都相同。
如果您可以合理准确地估算输出大小,可以使用初始大小提示创建ByteArrayOutputStream。
答案 3 :(得分:0)
正如迈克尔斯回答的那样,你可以通过不自己将输入或输出xml完全加载到内存中来加快速度,并使你的api流基于。