【发布时间】:2021-12-15 13:07:10
【问题描述】:
我有一个 250mb 的大 xml 文档,其中一个标签包含我需要处理的另一个 xml。
但问题是,这个 xml 是由 CDATA 包装的,如果我尝试做一个 replace/replaceAll
String xml= fileContent.replace("<![CDATA[", " ");
String replace = xml.replace("]]>", " ");
我开始了
java.lang.OutOfMemoryError: Java heap space
一个简单的结构示例。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<a>
<b>
<c>
<![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="yes"?><bigXML>]]>
</c>
</b>
</a>
即使使用像 VDT 或 SAX 这样的 XML 解析器也无济于事,因为我仍然需要删除 <![CDATA[,而我们里面的内容是文件的最大部分。
分配更多内存堆不是一个选项,因为它在我没有任何 JVM 控制的机器上运行。
知道如何从 c 标签中提取 xml 并从 <![CDATA[ 中提取
更新
正如我们在下面讨论的那样,我尝试使用 Streams 进行修改,但我仍然拥有outOfMemories。
知道如何改进代码以避免错误吗?
private void readUpdateAndWrite(
Reader reader,
String absolutePath
) {
// Write the content in file
try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(absolutePath))) {
// Read the content from file
try (BufferedReader bufferedReader = new BufferedReader(reader)) {
String line = bufferedReader.readLine();
while (line != null) {
String replace = line
.replace("<![CDATA[", " ")
.replace("]]>", " ");
bufferedWriter.write(replace);
line = bufferedReader.readLine();
}
} catch (IOException e) {
logger.error("Error writing in file. Caused by {}", getStackTrace(e));
}
} catch (IOException e) {
logger.error("Error reading in file. Caused by {}", getStackTrace(e));
}
}
我发现了我的问题。 <![CDATA[ 的内容是一个 256mb 的字符串行,所以我无法在该行中进行任何替换,否则我会得到 outOfMemory。
如何将 256mb 的字符串分成新行。我试图通过大量字符串创建另一个InputStream,但没有工作。
我猜是因为是嵌入式 XML,我们不能有多行。
【问题讨论】:
-
如何使用 SAX 或基于流的 API 解析大 XML 文件并提取您感兴趣的内容,而不是读取整个文件?
-
是的,我用 VDT 做,但问题是文档的最大部分在
]]>
标签: java string xml-parsing