Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 大型XML的XML节点到字符串转换_Java_Android_Xml_Out Of Memory_Xslt - Fatal编程技术网

Java 大型XML的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

到目前为止,在我的Android应用程序中,我一直在使用DOMSource将XML文件转换为字符串

这是我的代码

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");