阅读文档,这是我见过的所有示例中使用的方法:
(org.jdom.input.SAXBuilder
的版本为jdom-1.1.jar
)
Document doc = new SAXBuilder().build(is);
Element root = doc.getRootElement();
Element child = root.getChild("someChildElement");
...
其中is
是InputStream
变量。
我想知道,因为这是一个SAX构建器(而不是DOM构建器),是否使用构建方法将整个输入流读入文档对象?或者它是否正在处理延迟加载,并且只要我请求具有Element.getChildren()
或类似功能的元素(源自根节点)只能通过文档转发,那么构建器会自动处理加载的块。我的流?
我需要确保我没有将整个文件加载到内存中。
谢谢, 麦克
答案 0 :(得分:2)
类似于JDom解析器的DOM解析器将整个XML资源加载到内存中,为您提供允许在XML元素中导航的Document
实例。
一些参考文献here:
DOM标准是内存文档的编码标准 模型。
here:
JDOM适用于逻辑内存中的XML树
DOM和JDom都在内部使用SAX解析器来读取XML资源,但它们仅使用它来将整个内容存储在它们返回的Document
实例中。实际上,使用Dom和JDom,客户端永远不需要提供处理程序来拦截由SAX解析器触发的事件。
请注意,DOM和JDom都没有义务在内部使用SAX 他们主要使用它们,因为SAX标准已经存在,因此使用它来报告错误是有意义的。
我需要确保我没有将整个文件加载到内存中。
您有两种编程模型可以使用XML:流媒体和文档对象模型(DOM) 你正在寻找第一个。
因此,通过提供处理程序来处理由SAX解析器生成的事件(startDocument()
,startElement()
等等),或者作为替代查看更加用户友好的API,使用SAX parser :STAX(XML的流式API):
作为JAXP系列中的API,可以比较StAX以及其他API, 到SAX,TrAX和JDOM。 在后两者中,StAX没有那么强大或者 灵活的TrAX或JDOM,但它也不需要那么多的内存 或处理器负载是有用的,在许多情况下,StAX可以 优于基于DOM的API 。上面提到的相同论点, 权衡DOM模型与流媒体的成本/收益 模特,在这里申请。
答案 1 :(得分:1)
它急切地解析整个文件以构建XML文件的内存表示(即Document
)。
如果您想完全确定,可以查看GitHub
上的来源。更重要的是以下课程:SAXBuilder
,SAXHandler
和Document
。