Проблемы с пустыми узлами xml при использовании Stax в Java

Я работаю над xml-писателем для преобразования формата. Я решил использовать StAX API (точнее, курсорный API) из-за возможностей потоковой передачи (входной файл довольно большой, и его нужно записывать сегмент за сегментом). Я использую формат данных (некоторые классы) для хранения проанализированных значений из входного файла. Я также создал несколько классов для записи XML-файла, которые имеют метод writeNode. Этот метод выглядит так:

public void writeNode(Object object){
writer.writeStartElement();
... some writeNode calls of the children nodes
writer.writeEndElement();

}

Объект с именем «писатель» является экземпляром класса StAXStreamWriter. Моя проблема в том, что иногда эти дочерние узлы пусты. В этих случаях родительские узлы вообще не должны быть записаны. Прямо сейчас я генерирую пустые узлы, потому что начальный тег текущего узла уже записан. Насколько я знаю, это необратимо. Любые идеи для решения этой проблемы?

наилучшие пожелания

Ларс

Обновлять:

Думаю, я нашел решение. Я напишу свой собственный класс, реализующий интерфейс XMLStreamWriter. В этом классе я буду использовать структуру данных очереди или списка для хранения начальных тегов до тех пор, пока не будет записано первое значение атрибута или узла.

Обновление 2:

Вот более точное описание моего решения. Я использовал шаблон проектирования декоратора, чтобы обернуть мой новый класс вокруг стандартного класса потоковой передачи. Этот класс имеет список ArrayList, в котором стартовые теги хранятся до тех пор, пока не будет вызван метод writeCharacter.


person Lars    schedule 19.01.2012    source источник


Ответы (1)


при просмотре XML-файла вы можете получить текущее событие с помощью xmlStreamReader.getEventType(). Когда вы сталкиваетесь с XMLStreamConstants.START_ELEMENT, вы можете сохранить открывающие имена тегов, например, в коллекции, которая сохраняет порядок вставки (например, LinkedHashSet).

Когда вы затем столкнетесь с XMLStreamConstants.CHARACTERS, выполните .getText() и запишите ранее сохраненные теги в xmlStreamWriter, но только если этот текст не пуст (возможно, вы также хотите .trim() .getText()-результата).

С уважением, Макс

person Max    schedule 19.01.2012