如何将 List 中的 XML 元素添加到 XMLEventWriter 中?将 XML 附加到已创建的 XMLEventWriter/XmlStreamWriter
How to add XML elements from List into XMLEventWriter? Append XML to already created XMLEventWriter/XmlStreamWriter
我有一个 List<String>
,其中包含作为 JAXB Marshaling
方法输出的一部分创建的 XML
事件。 JAXB Marshaling
过程完成后,此 List<String>
可能包含大量 XML.
这些 XML
片段是大 XML 的一部分。大 XML 有一些额外的 header 元素,所以我尝试使用 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
。我只想使用任何 approaches/libraries.
获得所需的输出
有人可以帮我解决这个问题吗?我只想将我的 List
中的 XML
添加到已经用几个节点创建的 XMLEventWriter
。
首先,你的结局是错误的:
xmlEventWriter.add(events.createEndDocument());
xmlEventWriter.add(events.createEndDocument());
它们应该是:
xmlEventWriter.add(events.createEndElement(new QName("fragments"), null));
xmlEventWriter.add(events.createEndElement(new QName("root"), null));
xmlEventWriter.add(events.createEndDocument());
其次,问题是 xer
事件 reader 以您不想复制的“结束文档”事件结束,因此您需要将其过滤掉。
为此,请将 xer
包装在一个委托中,该委托在到达“结束文档”事件时结束事件流:
xer = new EventReaderDelegate(xer) {
@Override
public boolean hasNext() {
if (! super.hasNext())
return false;
try {
return ! super.peek().isEndDocument();
} catch (@SuppressWarnings("unused") XMLStreamException ignored) {
return true;
}
}
};
我有一个 List<String>
,其中包含作为 JAXB Marshaling
方法输出的一部分创建的 XML
事件。 JAXB Marshaling
过程完成后,此 List<String>
可能包含大量 XML.
这些 XML
片段是大 XML 的一部分。大 XML 有一些额外的 header 元素,所以我尝试使用 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
。我只想使用任何 approaches/libraries.
有人可以帮我解决这个问题吗?我只想将我的 List
中的 XML
添加到已经用几个节点创建的 XMLEventWriter
。
首先,你的结局是错误的:
xmlEventWriter.add(events.createEndDocument());
xmlEventWriter.add(events.createEndDocument());
它们应该是:
xmlEventWriter.add(events.createEndElement(new QName("fragments"), null));
xmlEventWriter.add(events.createEndElement(new QName("root"), null));
xmlEventWriter.add(events.createEndDocument());
其次,问题是 xer
事件 reader 以您不想复制的“结束文档”事件结束,因此您需要将其过滤掉。
为此,请将 xer
包装在一个委托中,该委托在到达“结束文档”事件时结束事件流:
xer = new EventReaderDelegate(xer) {
@Override
public boolean hasNext() {
if (! super.hasNext())
return false;
try {
return ! super.peek().isEndDocument();
} catch (@SuppressWarnings("unused") XMLStreamException ignored) {
return true;
}
}
};