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

问题描述:

我有下面的代码是如何工作的认识问题:如何防止一对XMLEvent [Reader | Writer]将空标签分成start + end标签?

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事件”。

按照list of XMLEvents好像是没有办法使区别,它的确会产生StartElementEndElement事件。消费者需要针对StartElement紧接着是EndElement的情况进行优化。

这显然不是工厂返回的XMLEventReader的情况。如果你想自己优化这种行为,我看不出有什么其他的办法,而不是像做

  • 检查有什么用createXMLEventReader
  • 子类XMLEventReader实现返回来优化这种情况下
  • XMLInputFactory具体XMLEventReader实施并覆盖createXMLEventReader以返回您的XMLEventReader子类的一个实例

如果这听起来太复杂了(或者不是喔rk),我建议你去a solution使用XMLStreamWriter。这一个有一个专门的方法writeEmptyElement

(或者你可以试用一下我的home-made pretty printer,它是基于XMLStreamWriter

除非我弄错了,Woodstox可以适当配置可以产生空标签(默认),或没有(所以它总是会输出开始+结束标记,即使没有内容)。 由于您可以对XMLStreamWriter进行配置,因此您可以使用该流编写器生成XMLEventWriter,它应该按预期工作。

+0

_“除非我错了” - - 谁会知道更好!? ;-) – 2011-07-07 13:37:38

+0

:-) - 好的,没错,我很可能会在这个特定的事情上弄错。 – StaxMan 2011-07-07 19:31:52