如何将 List 中的 XML 元素添加到 XMLEventWriter 中?将 XML 附加到已创建的 XMLEventWriter/XmlStreamWriter

如何解决如何将 List 中的 XML 元素添加到 XMLEventWriter 中?将 XML 附加到已创建的 XMLEventWriter/XmlStreamWriter

我有一个 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));
        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 并不挑剔。我想要的只是使用任何方法/库获得所需的输出

有人可以帮我解决这个问题吗?我只想将 XML 中的 List 添加XMLEventWriter 中,该 =left(A2,find("!",A2,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 事件读取器以您不想复制的“End Document”事件结束,因此您需要将其过滤掉。

要做到这一点,请将 xer 与一个在到达“End Document”事件时结束事件流的委托包装起来:

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;
        }
    }
};

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?