【发布时间】:2014-04-30 05:36:43
【问题描述】:
避免内存中的大对象,或使用字符串来保存应该使用更好的工具处理的大文档。例如,不要将大型 XML 文档读入 String 或 DOM。
以上引用来自一篇文章。阅读大型 xml 文档的最佳解决方案是什么?
【问题讨论】:
-
SAX 解析将解决您的问题。尝试阅读以下链接 [stackoverflow.com/questions/3825206/…
避免内存中的大对象,或使用字符串来保存应该使用更好的工具处理的大文档。例如,不要将大型 XML 文档读入 String 或 DOM。
以上引用来自一篇文章。阅读大型 xml 文档的最佳解决方案是什么?
【问题讨论】:
使用 SAX 或 StAX 解析器它不会将 xml 的所有内容保存在内存中。
与 DOM 解析器不同,SAX 解析器不会在内存中创建 XML 文档的表示形式,因此速度更快,使用更少 记忆。相反,SAX 解析器通知客户端 XML 文档 通过调用回调来构建结构,也就是说,通过调用 org.xml.sax.helpes.DefaultHandler 实例提供给解析器。
这是一个示例实现:
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
DefaultHandler handler = new MyHandler();
parser.parse("file.xml", handler);
在哪里
我的处理程序
您定义在生成文档/元素的开始/结束等事件时要采取的操作。(以下只是基本实现)
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 {
}
}
this 是 SAX 和 StAX 解析器示例的好文章
【讨论】:
使用 SAX 或 Stax 解析器。不要使用 DOM 或 JAXB。
【讨论】: