1

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

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

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

writer.add(reader);

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

输入

<root><c/></root>

变成

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

我知道,从 XML 的角度来看,这些是平等的树,但对人类来说不是 ;)

我该怎么做才能获得相同的输出?

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

4

2 回答 2

1

根据XMLEvents 的列表,似乎没有办法进行区分,它确实会生成一个StartElementandEndElement事件。消费者需要针对 aStartElement紧随其后的情况进行优化EndElement

这显然不是XMLEventReader工厂退回的情况。如果您想自己优化这种行为,我认为除了做类似的事情之外别无他法

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

如果这听起来太复杂(或不起作用),我建议您使用使用XMLStreamWriter. 这个有专门的方法writeEmptyElement

(或者你可以试试我自制的漂亮打印机,它是基于XMLStreamWriter

于 2010-03-14T16:31:45.057 回答
1

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

于 2010-04-01T05:59:53.137 回答