Как предотвратить пару XMLEvent [Reader | Writer] от разделения пустых тегов на начальный + конечный теги? - PullRequest
1 голос
/ 14 марта 2010

У меня проблема с пониманием того, как работает следующий код:

XMLInputFactory xif = XMLInputFactory.newFactory();
XMLOutputFactory xof = XMLOutputFactory.newFactory();

XMLEventReader reader = xif.createXMLEventReader(/* ... */);
XMLEventWriter writer = xof.createXMLEventWriter(/* ... */);

writer.add(reader);

Метод writer.add ([некоторый читатель]) читает все события из читателя и записывает их последовательно. К сожалению, происходит следующее:

Ввод

<root><c/></root>

преобразуется в

<root><c><c/></root>

Я знаю, с точки зрения XML, это равные деревья, но не для человека;)

Что я могу сделать, чтобы получить тот же вывод?

К вашему сведению: мне понадобится пара XMLEvent [Reader | Writer] для фильтрации «событий XML».

Ответы [ 2 ]

1 голос
/ 01 апреля 2010

Если я не ошибаюсь, Woodstox может быть настроен либо на создание пустых тегов (по умолчанию), либо нет (поэтому он всегда будет выводить теги start + end, даже если содержимого нет). Поскольку вы можете настроить это для XMLStreamWriter и затем создать XMLEventWriter, используя этот потоковый модуль записи, он должен работать как положено.

1 голос
/ 14 марта 2010

Согласно списку XMLEvents кажется, что нет никакого способа провести различие, и оно действительно сгенерирует события StartElement и EndElement. Потребителю потребуется оптимизировать ситуацию, когда сразу за StartElement следует EndElement.

Это, очевидно, не тот случай XMLEventReader, возвращенный фабрикой. Если вы хотите оптимизировать это поведение самостоятельно, я не вижу другого пути, кроме как сделать что-то вроде

  • проверьте, что является конкретной XMLEventReader реализацией, возвращенной createXMLEventReader
  • подкласс реализации XMLEventReader для оптимизации этого случая
  • подкласс XMLInputFactory и переопределение createXMLEventReader для возврата экземпляра вашего XMLEventReader подкласса

Если это звучит слишком сложно (или не работает), я бы посоветовал вам воспользоваться решением , которое использует XMLStreamWriter. У этого есть специальный метод writeEmptyElement.

(Или вы можете попробовать мой домашний симпатичный принтер , он основан на XMLStreamWriter)

...