如何在java中将大型XML转换为字符串

Posted

技术标签:

【中文标题】如何在java中将大型XML转换为字符串【英文标题】:How to convert large XML to string in java 【发布时间】:2017-02-20 18:29:06 【问题描述】:

作为 PIG 脚本的一部分,我需要获取使用 UDF 生成的 XML,并且 XML 太大(大约 1.5GB)。目前我正在使用下面的代码将 XML 转换为字符串

    StringWriter sw = new StringWriter();
    XMLWriter output = new XMLWriter(sw, xmlFormat);
    try 
       output.write(document);
        output.close();
     catch (IOException e) 

    return sw.toString();

这会抛出 OutofMemoryError,因为 StringWriter 在内部使用字符串缓冲区并且它依赖于 Arrays。因为 Arrays 使用整数作为索引并且 XML 的长度超出了 int 范围。

有没有办法将这个大的 xml 转换为 String 并将其发送回 pig 脚本?或者我们可以通过任何其他方式实现它。

仅供参考 - 我们使用 dom4j(org.dom4j.Document) 来处理 XML

更新1: 我尝试了下面的代码,现在我可以存储 800 MB,但 1.5 GB 的文件仍然失败

    ByteArrayOutputStream result = new ByteArrayOutputStream();
    try 
        XMLWriter output = new XMLWriter(result, xmlFormat);
        output.write(document);
        output.close();
        return result.toString("UTF-8");
     catch (IOException e) 

【问题讨论】:

AFAIK XML 已经是一种基于文本的格式,所以它实际上已经是一个字符串。另外我不知道您为什么要将其转换为字符串,也许问题出在您的推理上。在任何情况下,您都可以:1) 为 JVM 分配更多内存或 2) 使用文件而不是字符串进行传输,然后在另一端读取它。 【参考方案1】:

为避免内存不足,您需要流式传输您的 xml 文件。您可以为此使用 StreamingXMLLoader 流并直接在 Pig 脚本中解析您的 xml。

【讨论】:

以上是关于如何在java中将大型XML转换为字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何在java中将String转换为DOM Document对象?

如何在 PHP 中将 XML 字符串转换为 DOMDocument?

如何在QT中将xml节点数据转换为字符串[重复]

如何在iOS中将字符串转换为xml? (目标 C,xcode 7.2)

如何在 java 中将 org.w3c.dom.Element 输出为字符串格式?

如何在Java中将String转换为long?