2014-01-28 3 views
0

Я провел некоторое исследование, посмотрел на таблицу внизу (1), и я пытаюсь выяснить, какой API я должен использовать.Какой Java XML API использовать в моем приложении - StAX или DOM?

Позволь мне представить проблему моего приложение в движении, чтобы решить:

Моего приложения слушает некоторые события наблюдателей обожженных из всех мест (например, событие из КДИ) в некотором классе наблюдателя. В этом классе существуют методы наблюдения этих событий.

Мне нужно создать XML-файл «на лету», поскольку эти события наблюдаются. Более конкретно, когда я наблюдаю событие «start», мне нужно создать этот xml.

<start></start> 

После этого, когда я наблюдаю другое событие, как «установлен» (не имеет значения, как это называется на самом деле), мне нужно иметь такую ​​структуру:

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

Everytime я наблюдаю какое-то событие , Мне нужно иметь возможность записать это представление XML во внешний файл. Подводя итог, кажется, что я не могу использовать SAX, потому что SAX просто анализирует XML-документы, но мне нужно их написать или построить. Затем я собираюсь использовать StAX или DOM, но StAX «только вперед», который я не совсем понимаю, что он означает, но когда я беру StAX API, он ведет себя так (2), и когда он «вперед», я «принудительно» вручную запускать и заканчивать элементы, но это не применимо в моем случае. Я не знаю, когда я собираюсь закончить создание документа, мне просто нужно иметь действительный xml каждый раз, чтобы написать его.

Однако существует такой способ (3), который гласит, что когда я его называю, он автоматически закрывает все элементы. Так, например, когда у меня есть это:

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

и я называю writeEndDocument(), это означает, что, что он автоматически закрывает «с» и «а»?

(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()

+0

Рассмотрите VTD-XML ... есть статья на эту тему http: //www.javaworld.com/article/2071745/soa/simplify-xml-processing-with-vtd-xml.html –

ответ

1

Я рекомендую использовать следующие библиотеки XML (упорядоченные по рекомендации, только использовать следующий, если один перед тем не подходит вам нужен):

  1. JAXB (работа с объектами, а не XML)
  2. StAX (нижний уровень, чем JAXB)
  3. SAX (только для чтения; следует редко используется в настоящее время с JAXB и StAX доступны)
  4. DOM (должно быть редко используется теперь с JAXB и StAX доступен)
1

Не следует использовать методы XML более низкого уровня (либо SAX или DOM), если вы действительно не нужно их. Я считаю, что это не так.

Использование JAXB. Создайте класс, который представляет ваши события. Каждый раз, когда вы получаете событие, создавайте экземпляр этого класса и заполняйте поля. Каждый раз, когда вы должны создавать XML, просто маршалируйте экземпляр (ы) для любого потока, который вы хотите (файл, сокет, что угодно).

+0

Проблема в том, что это будет какое-то репортерское приложение, в котором кто-то может запустить свое собственное событие, которое будет обработано XML, поэтому я делаю не знать заранее каждый объект, о котором сообщалось бы. Это означает, что пользователь должен будет предоставить JAXB представление о классе, о котором сообщается. Я бы предпочел каким-то образом переслать обработчик, в котором пользователь собирает свой объект по своему усмотрению. – stewenson

+0

Ну, я думаю, что это не так уж плохо. Пользователь может просто реализовать свое представление об объекте, который хочет сообщить и отправить этот объект, в случае наблюдения наблюдателя, и он будет добавлен в структуру. – stewenson