XMLEventWriter: как я могу сказать, что он пишет пустые элементы?

Я не вижу опции в javax.xml.stream.XMLEventWriter или javax.xml.stream.XMLOutputFactory, чтобы установить либо вверх таким образом, чтобы были записаны пустые элементы (а не явные пары начального и конечного элементов).

Я вижу, что у Woodstox есть свойство сделать это, но оно не стандартизировано.

У меня отсутствует какой-либо очевидный способ сделать это?

Ответ 1

Нет. Между <x/> и <x></x> нет семантической разницы, а стандартные API не предоставляют способ запроса того или другого.

Ответ 2

writer.writeEmptyElement("some_element");
writer.writeAttribute("some_attribute", "some_value");

Ответ 3

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

Ответ 4

Устанавливает свойство так, что пустые теги генерируются как <x/> работает с API-интерфейсами WoodStox:

WstxOutputFactory factory = new WstxOutputFactory();
factory.setProperty(WstxOutputFactory.P_AUTOMATIC_EMPTY_ELEMENTS, true);

Мне нужно отступы в тегах XML. метод setIndentation не работает ни с javax.xml.stream.XMLOutputFactory, ни с org.codehaus.stax2.XMLOutputFactory2

Ответ 5

В нескольких ответах и ​​комментариях есть некоторая путаница.

StAX имеет два API:

  • "API-интерфейс курсора" с использованием XMLStreamReader и XMLStreamWriter; и
  • "API-интерфейс Iterator" с использованием XMLEventReader и XMLEventWriter;

Вывод пустого элемента с одним тегом, <example/>, возможен с помощью API-интерфейса Cursor с помощью XMLStreamWriter:

xmlStreamWriter.writeEmptyElement("example");

Вывод пустого элемента с единственным тегом <example/>, не может быть возможен с API-интерфейсом Iterator с использованием XMLEventWriter, насколько я знаю. В этом случае вы застреваете с созданием пустого элемента с двумя тегами <example></example>:

xmlEventWriter.add(xmlEventFactory.createStartElement("", null, "example"));
xmlEventWriter.add(xmlEventFactory.createEndElement("", null, "example"));