在我的应用程序中使用什么Java XML API - StAX或DOM?

时间:2014-01-28 14:06:33

标签: java xml dom stax

我做了一些研究,看了下面的表格(1),我试图找出我应该使用哪种API。

让我介绍一下我的应用程序要解决的问题:

我的应用程序在某些观察者类中侦听从所有位置(例如来自CDI的事件)触发的一些观察者事件。在该类中,有一些方法可以观察这些事件。

我需要在观察这些事件时即时构建XML文件。更具体地说,当我观察事件“开始”时,我需要创建这个xml。

<start></start>

之后,当我观察到其他一些事件,比如“已安装”(无论真正调用它是什么),我需要有这样的结构:

<start><installed></installed><start>

每次观察某些事件时,我都需要能够将该XML表示写入外部文件。总结一下,似乎我不能使用“SAX”,因为SAX只解析XML文档,但我需要编写它们或构造它们。接下来,我将使用StAX或DOM,但StAX是“仅向前”,我不太明白它代表什么,但是当我使用StAX API时,它表现得像这样(2),当它是“向前”时,我是“强制”手动启动和结束元素,但这在我的情况下不适用。我不知道什么时候我要结束文档生成,我只需要每次都有有效的xml来编写它。

但是,有一种方法(3)表示当我调用它时,它会自动关闭所有元素。所以例如当我有这个:

<a>
    <b></b>
    <c>
        <d>
        </d>

我调用writeEndDocument(),这是否意味着它会自动关闭“c”和“a”?

(1)http://docs.oracle.com/cd/E17802_01/webservices/webservices/docs/1.6/tutorial/doc/SJSXP2.html

(2)http://docs.oracle.com/javase/tutorial/jaxp/stax/example.html#bnbgx

(3)http://docs.oracle.com/javase/6/docs/api/javax/xml/stream/XMLStreamWriter.html#writeEndDocument()

2 个答案:

答案 0 :(得分:1)

我建议使用以下XML库(按推荐排序;如果之前的那个不适合您,则仅使用下一个):

  1. JAXB(使用对象而不是XML)
  2. StAX(比JAXB更低级别)
  3. SAX(仅供阅读;现在很少使用JAXB和StAX)
  4. DOM(现在应该很少使用JAXB和StAX)

答案 1 :(得分:1)

除非确实需要,否则不要使用低级XML技术(SAX或DOM)。我相信情况并非如此。

使用JAXB。创建代表您的事件的类。每次获取事件时都会创建此类的实例并填充字段。每次必须创建XML时,只需将实例封送到您想要的任何流(文件,套接字等)。