Проблемы с пустыми узлами xml при использовании Stax в Java - PullRequest
0 голосов
/ 19 января 2012

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

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

}

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

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

Ларс

Обновление:

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

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

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

1 Ответ

1 голос
/ 19 января 2012

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

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

С уважением, Max

...