如何防止一对XMLEvent [Reader | Writer]将空标签分成start + end标签?

时间:2010-03-14 16:06:24

标签: java xml pretty-print stax

我对以下代码的工作原理有一个了解的问题:

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

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

writer.add(reader);

方法writer.add([some reader])从读取器读取所有事件并因此写入它们。可悲的是,发生了以下情况:

输入

<root><c/></root>

转换为

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

我知道,从XML的角度来看,这些是相同的树,但不适用于人类;)

我可以做些什么来获得相同的输出?

仅供参考:我稍后需要一个XMLEvent [Reader | Writer]对来过滤“XML事件”。

2 个答案:

答案 0 :(得分:1)

根据list of XMLEvents,似乎没有办法进行区分,它确实会产生StartElementEndElement事件。如果StartElement后面紧跟EndElement,则消费者需要优化案例。

这显然不是工厂返回的XMLEventReader的情况。如果你想自己优化这种行为,除了做

这样的事情之外别无他法
  • 检查XMLEventReader
  • 返回的具体createXMLEventReader实现是什么
  • 继承XMLEventReader实现以优化此案例
  • 子类XMLInputFactory并覆盖createXMLEventReader以返回XMLEventReader子类的实例

如果这听起来太复杂(或不起作用),我建议你选择使用XMLStreamWriter的{​​{3}}。这个方法有一个专用方法writeEmptyElement

(或者您可以尝试我的a solution,它基于XMLStreamWriter

答案 1 :(得分:1)

除非我弄错了,Woodstox可以配置为生成空标签(默认)或不生成(因此即使没有内容,它也会始终输出开始+结束标记)。 由于您可以为XMLStreamWriter配置它,然后您可以使用该流编写器生成XMLEventWriter,它应该按预期工作。