0

我从这个链接中发现Java 中有几种类型的 XML 解析器。你能帮我选择哪一个会消耗更少的内存并且工作得更快:

DOM XML Parser
SAX XML Parser
JDOM XML Parser
JAXB

我想用 C 客户端创建 Java 服务器应用程序,它使用 XML 通过网络进行通信。如果我选择使用 JAXB,我可以轻松地将它与libxml? libxml如果我使用 JAXB 并在应用程序之间传输数据,可能会出现哪些问题?

4

3 回答 3

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 的便利性结合起来,生成您自己的对象树(而不是“节点”树)。

于 2012-06-15T15:05:12.493 回答
1

如果你想使用更少的内存,我会选择 SAX。它是一个基于事件的解析实用程序。整个 XML 文件不会像 DOM 对象那样加载到内存中。你把你想保存的东西保存在内存中。SAX 的另一个好处是你只控制你想要的事件,这确实可以提高解析的速度。

于 2012-06-15T15:04:51.617 回答
1

DOM 将使用更多内存 - 您将需要在内存中创建整个 xml DOM 模型。因此 SAX 或 STAX 将允许解析您需要的内容并节省内存。

JAXB 允许您从 beans 自动映射到 xml 和反向。

于 2012-06-15T15:07:16.370 回答