我们可以使用其中任何一个(SAX,DOM,STAX,XSTREAM)将XML转换为对象。请告诉我,选择其中一个的标准是什么。
答案 0 :(得分:1)
SAX和DOM是不同的样式解析器。它们之间的主要区别在于DOM将整个文档加载到内存中,并允许您对其执行操作(如XPath查询)。 SAX将解析XML文档并回调您的代码。
作为一般的经验法则,如果您要问,我认为DOM最初可能更容易使用,除非您需要将大量XML文档加载到内存中,否则可能不会成为问题。
如果您希望将XML转换为Java对象,那么有一些框架可以为您执行此操作,并抽象XML解析层。我过去曾经使用过Castor,但是你可以通过快速的Google找到更新的框架。
答案 1 :(得分:1)
Marco Tedone的这一基准比较可能会帮助您选择解析方法。
XML unmarshalling benchmark in Java: JAXB vs STax vs Woodstox
答案 2 :(得分:1)
JAXB (JSR-222)是用于将域对象转换为XML或从XML转换的Java标准。从Java SE 6开始,JDK / JRE中包含一个实现。还有其他开源实现可用(我是EclipseLink JAXB (MOXy)领导)。
由于您提到了XStream,下面是我写的一篇文章,比较了JAXB和XStream:
DOM 是一种内存数据结构,它将XML数据表示为Node
个对象的树。 Node
的扩展名表示元素,属性,文本等。
SAX / StAX 是非常轻量级的API,允许您使用非常大的XML文档。
答案 3 :(得分:0)
DOM解析器是树模型化的。它通常会基于XML文件中的嵌入结构为XML文档构建一个完整的树。 DOM的优点是您可以随机访问任何XML节点,其子节点,兄弟节点以及属性。显然,缺点是该方法消耗太多RAM,因为它试图将所有XML数据加载到存储器中。
至于SAX,它是基于事件的。它将XML数据作为流读入,并且当某些事件(文档开始/结束,遇到打开/关闭标记等)发生时,您可以覆盖这些函数。处理大型XML数据时,此解析器功能更强大。但是,正如您所猜测的那样,当流数据消失时,您永远无法将其取回。因此,SAX解析器无法进行随机访问。
关于StAX,与SAX和DOM相比,它是一个相对较新的模型,事实上,它被设计为两个先前模型之间的中位数。它使您可以读取和写入XML文档。 StAX的想法是保持SAX的流特性。但是这个流与SAX不同。我们将其称为 pull-streaming ,而对于SAX,它是推送流。在推送流模型中,解析器解析器发送数据,无论客户端是否准备好在那时使用它。相反,只有当我们的应用程序准备好使用数据时,拉流模型才会明确地要求XML数据。
在我看来,StAX是最好的选择,但DOM和SAX也是理解利弊的良好开端。
注意:由于我的知识有限,我对 XSTREAM 了解不多。希望其他人可以帮助你!