我对以下代码的工作方式有一个了解的问题:
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事件”。
最佳答案
根据list of XMLEvents的说法,似乎没有办法进行区分,并且确实会产生StartElement
和EndElement
事件。当StartElement
紧跟在EndElement
之后,使用者需要针对这种情况进行优化。
显然,工厂返回的XMLEventReader
并非如此。如果您想自己优化这种行为,除了采取类似的措施外,我别无选择
检查XMLEventReader
返回的具体createXMLEventReader
实现是什么
子类XMLEventReader
实现以优化这种情况
子类XMLInputFactory
并覆盖createXMLEventReader
以返回您的XMLEventReader
子类的实例
如果这听起来太复杂(或不起作用),我建议您使用使用XMLStreamWriter
的a solution。这是一种专用方法writeEmptyElement
。
(或者您可以尝试一下我的home-made pretty printer,它基于XMLStreamWriter
)