【发布时间】:2019-01-28 06:43:12
【问题描述】:
我有几个要转换为 JSON 的 XML 文件(大小为 GB)。我可以使用 JSON 库(org.json - https://mvnrepository.com/artifact/org.json/json/20180813)轻松转换小型文件(以 KiloBytes 为单位)。
这是我正在使用的代码
static String line="",str="";
BufferedReader br = new BufferedReader(new FileReader(link));
FileWriter fw = new FileWriter(outputlink);
JSONObject jsondata = null;
while ((line = br.readLine()) != null)
{
str+=line;
}
jsondata = XML.toJSONObject(str);
但是大文件(即使是
更新
我已经更新了代码,我正在逐段将 XML 写入 JSON
我的 XML:
<PubmedArticleSet>
<PubmedArticle>
</PubmedArticle>
<PubmedArticle>
</PubmedArticle>
...
</PubmedArticleSet>
所以我忽略了根节点<PubmedArticleSet>(我稍后会添加)将每个<PubmedArticle> </PubmedArticle>转换为JSON并一次写入
br = new BufferedReader(new FileReader(link));
fw = new FileWriter(outputlink,true);
StringBuilder str = new StringBuilder();
br.readLine(); // to skip the first three lines and the root
br.readLine();
br.readLine();
while ((line = br.readLine()) != null) {
JSONObject jsondata = null;
str.append(line);
System.out.println(str);
if (line.trim().equals("</PubmedArticle>")) { // split here
jsondata = XML.toJSONObject(str.toString());
String jsonPrettyPrintString = jsondata.toString(PRETTY_PRINT_INDENT_FACTOR);
fw.append(jsonPrettyPrintString.toString());
System.out.println("One done"); // One section done
str= new StringBuilder();
}
}
fw.close();
我不再收到 HeapError,但处理 ~300 MB 范围文件仍需要数小时。请提供任何建议以加快此过程。
【问题讨论】:
-
这就是用纯 C 编写的 Json 编码器/解码器应该派上用场的地方。 Parsing XML in Pure C & Parsing JSON using C。您可以尝试使用 JNI 将它们移植到 Java 中。
-
有几个 Java 库可以为您处理这种转换(并且以更有效的方式)。有关示例,请参阅此答案:stackoverflow.com/a/39493394/1420773
-
XML 数据的结构是否可以将其分成块并单独序列化?如果是这样,您可以在阅读后将每个块写出来,而不是全部加载。
-
当您说“JSON 库”时,您需要说出是哪一个。有几十个。
-
@MichaelKay “JSON 库”是指 JSON 库。 ( org.json )我已经更新了这个问题。如果有的话,请建议任何更好的替代库来完成任务。