我有大尺寸的xml文件,可以在500 mb到2 gb之间进行验证 喜欢自定义标签和其他验证的总数。我的问题是有一个很好的方式让我编组 完整的xml文件到没有OutOfMemory异常的java对象?我不认为它可能,因为我有2 GB的RAM 和ram大小1536 MB。但那么,替代方案是什么?
我应该使用STAX / SAX将xml拆分为更小的xml文件,然后使用单独的对象吗?然后算上顾客 每个java对象中的元素。将其存储为实例变量,然后将其重复为xml。汇总所有客户 计数。如果是,我怎么知道分解的xmls是单个xml的一部分。可能我需要引入一些相关Id 在文件名中,以便我可以知道单独的XML节点是单独的XML节点的一部分吗?
答案 0 :(得分:1)
为了解析你提到的大小的xml [高达2GB],你不必在RAM中加载所有这些。您可以使用SAX解析器进行解析。 Here我找到了一种有趣的方式
XMLReader r = new XMLReader();
r.addHandler("node", new NodeHandler() {
@Override
public void process(StructuredNode node) {
System.out.println(node.queryString("name"));
System.out.println(node.queryValue("price").asDouble(0d));
}
});
r.parse(new FileInputStream("src/examples/test.xml"));
Basicaly它是SAX和DOM的混合体。它为您要处理某些数据的元素创建do。此代码在MIT许可下,可以找到here
如果以上对您不可行,我建议你应该选择普通的StAX解析器Here是一个很好的教程,从
开始答案 1 :(得分:1)
与DOM解析器不同,SAX解析器不会创建内存 XML文档的表示,因此更快,使用更少 记忆。相反,SAX解析器通知客户端XML文档 通过调用回调来实现结构,即通过调用a上的方法 提供给解析器的
org.xml.sax.helpers.DefaultHandler
实例。
以下是一个示例实现:
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
DefaultHandler handler = new MyHandler();
parser.parse("file.xml", handler);
在MyHandler
中,您定义了生成文档/元素的开头/结尾等事件时要采取的操作。
class MyHandler extends DefaultHandler {
@Override
public void startDocument() throws SAXException {
}
@Override
public void endDocument() throws SAXException {
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
}
// To take specific actions for each chunk of character data (such as
// adding the data to a node or buffer, or printing it to a file).
@Override
public void characters(char ch[], int start, int length)
throws SAXException {
}
}