【发布时间】:2021-08-30 15:33:52
【问题描述】:
我有一个List<String>,其中包含作为JAXB Marshaling 方法输出的一部分创建的XML 事件。在完成JAXB Marshaling 进程后,这个List<String> 可以包含大量的XML。
这些XML 片段是大型XML 的一部分。大型 XML 有一些额外的标头元素,因此我尝试使用 XMLEventWriter 创建 large XML 并尝试从我的 LIST<String> 添加元素,但它无法按预期工作并遇到各种错误。
我收到以下错误:
Exception in thread "main" javax.xml.stream.XMLStreamException: Trying to output second root
以下是我的代码:
import javax.xml.namespace.QName;
import javax.xml.stream.*;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
public class TestMain {
public static void main(String[] args) throws XMLStreamException {
final XMLEventWriter xmlEventWriter = XMLOutputFactory.newInstance().createXMLEventWriter(System.out);
final XMLEventFactory events = XMLEventFactory.newInstance();
List<String> eventList = new ArrayList<>();
eventList.add("<fragment><data>First Event</data></fragment>");
eventList.add("<fragment><data>Second Event</data></fragment>");
eventList.add("<another><data>Third Event</data></another>");
xmlEventWriter.add(events.createStartDocument());
xmlEventWriter.add(events.createStartElement(new QName("root"), null, null));
xmlEventWriter.add(events.createStartElement(new QName("fragments"), null, null));
for (String event : eventList) {
final XMLEventReader xer = XMLInputFactory.newInstance().createXMLEventReader(new StringReader(event));
if (xer.peek().isStartDocument()) {
xer.nextEvent();
xmlEventWriter.add(xer);
}
}
xmlEventWriter.add(events.createEndDocument());
xmlEventWriter.add(events.createEndDocument());
xmlEventWriter.close();
}
}
以下是我期待的输出:
<root>
<fragments>
<fragment>
<data>First Event</data>
</fragment>
<fragment>
<data>Second Event</data>
</fragment>
<another>
<data>Third Event</data>
</another>
</fragments>
</root>
我查看了XMLStreamWriter,但我知道使用它无法做到这一点。我对XMLEventWriter 并不特别。我只想使用任何方法/库获得所需的输出。
有人可以帮我解决这个问题吗?我只想将List 中的XML 添加到已经用几个节点创建的XMLEventWriter。
【问题讨论】:
-
我不知道你为什么认为你需要(或想要)使用 XMLEventWriter(或 -Reader); XMLStreamWriter 和 XMLStreamReader 在这里应该可以正常工作,并且开销也较低。方法@andreas 大纲应该有效。如果您需要缓冲事件以进行存储或转换,则事件方法最有用;但对于即时生成/翻译而言,价值不大。
标签: java xml stax woodstox xmlstreamwriter