Существует очень полезный метод для генерации XML напрямую из POJO через SAX framework (не парсер SAX, а фреймворк SAX).Этот метод может быть использован для генерации XML-документа .
Генерация XML из произвольной структуры данных
http://download.oracle.com/javaee/1.4/tutorial/doc/JAXPXSLT5.html
По сути, вы добавляете методы в свой POJOили напишите служебный класс для ваших POJO, который превратит их в генераторы событий SAX (генерация событий, как это делает парсер SAX, при анализе XML-документа).Теперь ваш «генератор событий SAX» выглядит как выходная сторона синтаксического анализатора SAX, и ему может быть предоставлен любой обработчик содержимого, который будет использовать синтаксический анализатор SAX, например, тот, который pretyy печатает XML.Но его также можно передавать в анализатор DOM для создания дерева DOM или в механизм XSLT для генерации HTML или выполнения истинного перевода XSL без необходимости сначала создавать промежуточный документ XML из POJO.
ДляНапример, класс Person может иметь метод emitXML()
, который включает следующие строки:
handler.startElement(nsu, PERSON_TAG, PERSON_TAG, NO_ATTRIBUTES);
handler.startElement(nsu, FIRSTNAME_TAG, FIRSTNAME_TAG, atts);
handler.characters(this.firstName.toCharArray(),
0,
this.firstName.length());
handler.endElement(nsu, FIRSTNAME_TAG, FIRSTNAME_TAG);
... emit more instance variables
... emit child object like: homeAddress.emitXML(handler, ...);
handler.endElement(nsu, PERSON_TAG, PERSON_TAG);
Обновление:
Пара других ссылок:
Несколько ответов на комментарии:
Это правда, но интерфейс XMLStreamWriter, описанный выше, намного более удобен для пользователя.- Майкл Кей 3 часа назад
Да, но, думаю, я не совсем понял.Я мог бы легко пройти по иерархии и использовать XMLStreamWriter
для непосредственного вывода XML-документа в поток. Однако в статьях показан мощный метод обхода иерархии и генерации событий SAX вместо прямой выдачи XML-документа.Теперь я могу подключить разные обработчики контента, которые делают разные вещи или генерируют разные версии XML. Мы также можем передать нашу иерархию объектов любому инструменту, который принимает синтаксический анализатор SAX, например, движок XSLT.На самом деле, он просто использует преимущества шаблона посетителя, установленного инфраструктурой SAX: мы отделяем обход иерархии от вывода XML.Части, которые выводят XML, обработчики контента, должны обязательно использовать XMLStreamWriter
, если их целью является запись потока XML.
Например, в нашей программе мы отправляли сообщения XML по сетевым сокетам между распределеннымикомпоненты, и мы также использовали XSLT для генерации наших HTML-страниц.Ранее мы прошли через нашу иерархию, чтобы сгенерировать XML-документ (строку), а затем либо записали этот XML-документ в сетевой сокет, либо передали этот документ в механизм XSLT (который, по сути, просто анализировал его снова).После использования этого метода мы могли бы по существу передать нашу иерархию объектов (используя этот SAX-адаптер) непосредственно в механизм XSLT, не нуждаясь в промежуточной строке XML.Было также удобно иметь возможность использовать один обработчик содержимого для создания компактного представления XML для сетевого потока, а другой - для создания довольно распечатанного документа XML для записи в файл журнала.
* 1052Кроме того, использование API синтаксического анализатора SAX для написания XML является злоупотреблением API, IMHO.- Puce 49 минут назад
Возможно, но я думаю, что это зависит от ваших потребностей.Если требование OP состоит в том, чтобы просто написать конкретный XML-документ, то это определенно излишне.Однако я подумал, что стоит упомянуть, использует ли ОП в своем проекте XML другими способами, которые он не упомянул.Нет ничего плохого в том, чтобы выдвигать альтернативную идею.
Называть ее злоупотреблять может быть немного сильным, но я согласен, что вы имеете право на свое мнение.Он задокументирован в учебнике по Oracle, поэтому он не считается злоупотреблением со стороны инженеров Sun / Oracle.В нашем проекте было очень успешно помочь нам удовлетворить наши требования без каких-либо существенных недостатков, поэтому я буду держать этот подход в своем наборе инструментов, когда он пригодится в будущем.