Java 大型XML的XML节点到字符串转换
到目前为止,在我的Android应用程序中,我一直在使用DOMSource将XML文件转换为字符串 这是我的代码:Java 大型XML的XML节点到字符串转换,java,android,xml,out-of-memory,xslt,Java,Android,Xml,Out Of Memory,Xslt,到目前为止,在我的Android应用程序中,我一直在使用DOMSource将XML文件转换为字符串 这是我的代码: public String convertElementToString (Node element) throws TransformerConfigurationException, TransformerFactoryConfigurationError { Transformer transformer = TransformerFactory.newInst
public String convertElementToString (Node element) throws TransformerConfigurationException, TransformerFactoryConfigurationError
{
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
//initialize StreamResult with File object to save to file
StreamResult result = new StreamResult(new StringWriter());
DOMSource source = new DOMSource(element);
try {
transformer.transform(source, result);
}
catch (TransformerException e) {
Log.e("CONVERT_ELEMENT_TO_STRING", "converting element to string failed. Aborting", e);
}
String xmlString = result.getWriter().toString();
xmlString = xmlString.replace("<?xml version=\"1.0\" encoding=\"UTF-8\"?>", "");
xmlString = xmlString.replace("\n", "");
return xmlString;
}
公共字符串convertElementToString(节点元素)引发TransformerConfiguration异常,TransformerFactoryConfigurationError
{
Transformer Transformer=TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT,“是”);
//使用文件对象初始化StreamResult以保存到文件
StreamResult=新的StreamResult(新的StringWriter());
DOMSource=新的DOMSource(元素);
试一试{
变换(源、结果);
}
捕获(转换异常e){
Log.e(“将元素转换为字符串”,“将元素转换为字符串失败。正在中止”,e);
}
字符串xmlString=result.getWriter().toString();
xmlString=xmlString.replace(“,”);
xmlString=xmlString.replace(“\n”,”);
返回xmlString;
}
这个对于小型xml文件来说效果很好
但是对于大型xml这段代码开始抛出内存错误
它背后的原因可能是什么以及如何纠正这个问题?首先:如果您只需要XML作为字符串,而不使用
节点来处理任何其他内容,那么应该使用StAX(),因为它的内存占用要小得多。您将在标准库的javax.xml.stream
包中找到StAX
对当前代码的一个改进是更改行
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
到
由于您在方法末尾剥离换行符,因此在输出中请求额外的缩进不是很有用。这是一件很小的事情,但是如果XML中有很多标记(因此,换行符和缩进空格),可能会减少内存需求。XML有多大?它可能会达到10-15 MB。我知道这很古老,但我想使用StAX将XML作为字符串获取,我在任何地方都找不到任何示例。你能?我有一个文档,希望将其输出为XML字符串。我能找到的唯一例子就是循环遍历和构建一个对象。@hobbes\u child如果你已经有一个文档
,就没有必要涉及StAX。只需将文档
实例传递给transformer,如上面的问题所示。使用StAX的目的是为了避免使用文档
,以免将所有大型XML结构加载到内存中。谢谢,但是我的文档非常大,我在转换方法上得到了一个OOM。我曾尝试使用StringBuilder和StringWriter而不是Document,但在某些情况下,它们都需要一个toString(),这通常会给出一个OOM。我想在请求时传递字符串,以便打开XML文件进行下载。如果不使用toString()获取字节,我甚至无法生成ZIP。也许我应该打开我自己的问题…为什么需要转换为字符串?您不能使用FileWriter
和流到磁盘,或者使用OutputStreamWriter
和写入HTTP响应的输出流(如果这是API的一部分)吗?如果您想动态生成ZIP,一种方法是将PipedInputStream
和PipedOutputStream
与助手线程一起使用。如果您需要代码示例,请打开您自己的问题,并在此处添加带有链接的注释,我将尝试在此处回答。另一种动态制作ZIP的方法是将ZIP输出流转换为StreamResult
包装。
transformer.setOutputProperty(OutputKeys.INDENT, "no");