如何将长XML文件拆分成多个预定义的不同名称?
示例这是我的XML文件粘贴在一个长XML中,生成用于测试。 现在我必须拆分信封,每个都是一个新文件。
<envelope>
<tag1>1</tag1>
<tag2>2</tag2>
<tag3>3</tag3>
</envelope>
<envelope>
<tag1>1</tag1>
<tag2>2</tag2>
<tag3>3</tag3>
</envelope>
<envelope>
<tag1>1</tag1>
<tag2>2</tag2>
<tag3>3</tag3>
</envelope>
我之前已经使用了分割,而不是这样,整个xml没有开始和结束标记。
答案 0 :(得分:4)
我建议使其成型良好,然后按照建议使用SAX或StAX解决方案之一。唯一的区别是我会避免将整个内容加载到内存中,而是通过SequenceInputStream注入start和end元素。
例如:
InputStream in = new SequenceInputStream(
// start doc
new ByteArrayInputStream("<root>".getBytes()),
new SequenceInputStream(
new FileInputStream("envelopes.txt"),
// end doc
new ByteArrayInputStream("</root>".getBytes())));
答案 1 :(得分:2)
正如约阿希姆所说,这不是一个XML。
您可以尝试以编程方式添加根元素,将文件另存为某个地方,然后参考other类似的问题来解决它。
回答评论:
This可能会帮助您加载它。我怀疑你应该担心它的大小,因为要拆分它你必须把它加载到内存中然后再写它。
然后像:
final String xmlWithRootElement = "<root>" + IOUtils.toString(yourFile) + "</root>";
应该这样做。 (没有那么多硬编码的字符串)
最后一件事。
我建议找一个有效的解决方案。然后,如果您对性能不满意,可以寻找优化它的方法,或者您可以询问与性能相关的问题。
答案 2 :(得分:0)
如何逐个阅读文件并识别<envelope>
和</envelope>
序列。每当遇到<envelope>
时,您都会开始捕获缓冲区,直至到达</envelope>
。这样文件就可以像文件系统允许的那样大。对大文件的XML操作很令人头疼: - )