0

我有一个List<String>包含XML作为方法输出的一部分创建的事件JAXB Marshaling。完成该JAXB Marshaling过程后,这List<String>可能包含大量 XML。

这些XML片段因此是大型 XML 的一部分。大型 XML 有一些额外的标头元素,所以我试图创建large XML使用XMLEventWriter并尝试添加我的元素,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。我想要的只是使用任何方法/库获得所需的输出。

有人可以帮我吗?我只想添加已经用几个节点创建的XMLfrom my Listto 。XMLEventWriter

4

1 回答 1

1

首先,您的结束事件是错误的:

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事件阅读器以您不想复制的“结束文档”事件结束,因此您需要将其过滤掉。

为此,请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;
        }
    }
};
于 2021-06-14T19:04:27.903 回答