Ответ 1
Там очень полезный метод для генерации XML непосредственно из POJO через фреймворк SAX (не SAX-анализатор, а SAX-framework). Этот метод может быть использован для создания XML-документа.
Создание XML из произвольной структуры данных
http://download.oracle.com/javaee/1.4/tutorial/doc/JAXPXSLT5.html
По существу, вы добавляете методы в свой POJO или записываете класс утилиты для POJO, которые превращают их в эмитентов событий SAX (при синтаксическом анализе XML-документа обычно возникают события, такие как SAX-парсер). Теперь ваш "генератор событий 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);
Update:
Несколько других ссылок:
- Преобразование устаревших данных в XML с помощью JAXP
http://www.devx.com/java/Article/16925 - Преобразование плоских файлов в XML с помощью SAX и XSLT
http://www.developer.com//xml/article.php/2108031/Transforming-Flat-Files-To-XML-With-SAX-and-XSLT.htm
Несколько ответов на комментарии:
Это верно, но описанный выше интерфейс 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 для записи в файл журнала.
Кроме того, использование API-анализатора SAX для записи XML является неправильным использованием API, IMHO. - Puce 49 мин назад
Возможно, но я думаю, что это зависит от ваших потребностей. Если требование OP заключается только в том, чтобы выписать конкретный XML-документ, то это определенно излишне. Тем не менее, я думал, что стоит упомянуть, использует ли OP другой метод в своем проекте, о котором он не упоминал. Нет никакого вреда в подаче альтернативной идеи.
Вызов неправильного использования может быть немного сильным, но я согласен, что вы имеете право на свое мнение. Он документирован в учебнике Oracle, поэтому его не считают злоупотреблением инженерами Sun/Oracle. Это было очень успешным в нашем проекте, чтобы помочь нам удовлетворить наши требования без существенных минусов, поэтому я буду придерживаться такого подхода в своей панели инструментов, когда это будет полезно в будущем.