我从这个link发现Java中有几种类型的XML解析器。你能帮我选择哪一个会消耗更少的内存并且工作得更快:
DOM XML Parser
SAX XML Parser
JDOM XML Parser
JAXB
我想用C客户端创建Java服务器应用程序,它使用XML通过网络进行通信。
如果我选择使用JAXB,我可以轻松地将其与libxml
集成吗?如果我使用JAXB和libxml
在应用程序之间传输数据,可能会出现哪些问题?
答案 0 :(得分:2)
这些是更多的解析技术,而不是实际的解析工具。 Xerces是解析工具的一个示例。
SAX有助于提高速度和解析事件处理。从事件中解析可以轻松地让您跳过不感兴趣的事件,并且跳过的惩罚很低。在读取整个文档时,无需存储它,因此SAX可以处理大于系统内存的文档。
DOM可以将整个文档保存在内存中。这样做很容易让你工作需要文档的所有元素(交叉引用等)。这种便利是有代价的,与SAX不同,您必须有足够的内存来存放整个文档。
JDOM基本上是DOM,但具有不同的编程接口。它假设它的编程接口更符合Java,无论这意味着什么。
JAXP是一套XML处理工具,它以可插入的方式包含SAX和DOM接口,可以轻松地交换后端实现。
JAXB是一套XML处理工具,可以方便地将XML映射到常规Java对象,并从常规Java对象生成XML。
就个人而言,我喜欢SAX,但是为了使用SAX进行有效的解析,你应该使用一个堆栈和上下文敏感的解析器块,这些块被推入堆栈并弹出它,从而构建XML映射到的对象。我们的想法是,您将文档中的位置保持为StringBuffer,然后推入处理程序来处理输入元素,然后处理所有事件,直到它检测到正确的退出事件。然后上面的处理程序从弹出的子处理程序中读取对象。这样的技术需要一些工作,但是可以将SAX的速度与DOM的便利性结合起来,产生您自己的对象树(而不是“节点”树)。
答案 1 :(得分:1)
如果你想减少使用内存,我会选择SAX。它是一个基于事件的解析实用程序。整个XML文件不会像DOM对象一样加载到内存中。您可以在内存中保存要保存的内容。关于SAX的另一个好处是你只控制你想要的事件,这可以真正提高解析的速度。
答案 2 :(得分:1)
DOM将使用更多内存 - 您将需要在内存中创建整个xml DOM模型。因此,SAX或STAX将允许解析您需要的内容并保存内存。
JAXB允许您自动从bean映射到xml并反向。