我对以下代码的工作原理有一个了解的问题:
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事件”。
答案 0 :(得分:1)
根据list of XMLEvents,似乎没有办法进行区分,它确实会产生StartElement
和EndElement
事件。如果StartElement
后面紧跟EndElement
,则消费者需要优化案例。
这显然不是工厂返回的XMLEventReader
的情况。如果你想自己优化这种行为,除了做
XMLEventReader
createXMLEventReader
实现是什么
XMLEventReader
实现以优化此案例XMLInputFactory
并覆盖createXMLEventReader
以返回XMLEventReader
子类的实例如果这听起来太复杂(或不起作用),我建议你选择使用XMLStreamWriter
的{{3}}。这个方法有一个专用方法writeEmptyElement
。
(或者您可以尝试我的a solution,它基于XMLStreamWriter
)
答案 1 :(得分:1)
除非我弄错了,Woodstox可以配置为生成空标签(默认)或不生成(因此即使没有内容,它也会始终输出开始+结束标记)。 由于您可以为XMLStreamWriter配置它,然后您可以使用该流编写器生成XMLEventWriter,它应该按预期工作。