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

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的说法,似乎没有办法进行区分,并且确实会产生StartElementEndElement事件。当StartElement紧跟在EndElement之后,使用者需要针对这种情况进行优化。

显然,工厂返回的XMLEventReader并非如此。如果您想自己优化这种行为,除了采取类似的措施外,我别无选择


检查XMLEventReader返回的具体createXMLEventReader实现是什么
子类XMLEventReader实现以优化这种情况
子类XMLInputFactory并覆盖createXMLEventReader以返回您的XMLEventReader子类的实例


如果这听起来太复杂(或不起作用),我建议您使用使用XMLStreamWritera solution。这是一种专用方法writeEmptyElement

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

07-28 03:32