java - XMLEventWriter 抛出 javax.xml.stream.XMLStreamException: No open start element,当尝试写入结束元素时,即使打开
问题描述
我有一个应用程序JSON -> XML
转换器。这个应用程序将接受一个List
被一个一个地转换为 XML 的事件。在转换之前,将使用该start
方法创建最终 XML 的标头,然后将转换后的事件xmlEventWriter
一一添加,最后在所有转换后将结束标记添加到 XML usingend
方法。
我在关闭标签并遇到错误时遇到问题:
javax.xml.stream.XMLStreamException: No open start element, when trying to write end element
根据我的理解,一切都是正确的,但仍然面临不知道为什么的问题。
以下是将header body and closure
在 XML 中创建标签的类:
public class EventXMLStreamCollector implements EventsCollector<OutputStream> {
private final OutputStream stream;
private final XMLEventWriter xmlEventWriter;
private final XMLEventFactory events;
public EventXMLStreamCollector(OutputStream stream) {
this.stream = stream;
try {
xmlEventWriter = XMLOutputFactory.newInstance().createXMLEventWriter(stream);
events = XMLEventFactory.newInstance();
} catch (XMLStreamException e) {
throw new EventFormatConversionException("Error occurred during the creation of XMLEventWriter : " + e);
}
}
public void collect(Object event) {
System.out.println("COLLECT START");
try {
XMLEventReader xer = new EventReaderDelegate(XMLInputFactory.newInstance().createXMLEventReader(new StringReader(event.toString()))) {
@Override
public boolean hasNext() {
if (!super.hasNext())
return false;
try {
return !super.peek().isEndDocument();
} catch (XMLStreamException ignored) {
return true;
}
}
};
if (xer.peek().isStartDocument()) {
xer.nextEvent();
xmlEventWriter.add(xer);
}
} catch (XMLStreamException e) {
throw new EventFormatConversionException("Error occurred during the addition of events to XMLEventWriter: " + e);
}
System.out.println("COLLECT END");
}
@Override
public OutputStream get() {
return stream;
}
@Override
public void start(Map<String, String> context) {
System.out.println("START START");
try {
xmlEventWriter.add(events.createStartDocument());
xmlEventWriter.add(events.createStartElement(new QName("doc:Document"), null, null));
xmlEventWriter.add(events.createNamespace("doc", "urn:one"));
xmlEventWriter.add(events.createNamespace("xsi", "http://www.w3.org/2001/XMLSchem-instance"));
xmlEventWriter.add(events.createNamespace("cbvmda", "urn:two"));
for (Map.Entry<String, String> stringStringEntry : context.entrySet()) {
xmlEventWriter.add(events.createAttribute(stringStringEntry.getKey(), stringStringEntry.getValue()));
}
xmlEventWriter.add(events.createStartElement(new QName("Body"), null, null));
xmlEventWriter.add(events.createStartElement(new QName("EventList"), null, null));
} catch (XMLStreamException e) {
throw new EventFormatConversionException("Error occurred during the creation of final XML file header information " + e);
}
System.out.println("START END");
}
@Override
public void end() {
System.out.println("END START");
try {
System.out.println(xmlEventWriter.toString());
xmlEventWriter.add(events.createEndElement(new QName("EventList"), null));
xmlEventWriter.add(events.createEndElement(new QName("Body"), null));
xmlEventWriter.add(events.createEndElement(new QName("doc:Document"), null));
xmlEventWriter.add(events.createEndDocument());
xmlEventWriter.close();
} catch (XMLStreamException e) {
throw new EventFormatConversionException("Error occurred during the closing xmlEventWriter:" + e);
}
System.out.println("END END");
}
@Override
public void collectSingleEvent(Object event) {
try {
XMLEventReader xer = XMLInputFactory.newInstance().createXMLEventReader(new StringReader(event.toString()));
if (xer.peek().isStartDocument()) {
xer.nextEvent();
}
xmlEventWriter.add(xer);
} catch (XMLStreamException e) {
System.out.println("ADDED : " + e.getMessage());
throw new EventFormatConversionException("Error occurred during the addition of events to XMLEventWriter: " + e);
}
}
}
我收到此行的错误:
xmlEventWriter.add(events.createEndElement(new QName("Body"), null));
我不确定为什么会收到此错误。我正在打开Body
标签,然后尝试关闭它。我确信流程是正确的,我正在调用start
, collect
,然后是 finally end
。继output
我得到:
START START
START END
COLLECT START
COLLECT END
END START
END END
由于closing of Body
标签出现错误,我没有收到。有人可以帮我理解这个问题并提供一些解决方法和帮助。
解决方案
推荐阅读
- c# - .net 核心 Web 应用程序 - 什么在使用所有这些内存?小可枚举 vs 大可枚举 vs 流响应
- angular - 在命令提示符下找不到模块“@angular/compiler”
- kubernetes - ./kvtctl.sh 处的 vitess 安装失败远程错误:rpc 错误:代码 = 不可用 desc = 传输正在关闭
- jquery - 在溢出隐藏区域中向上滑动的文本效果
- templates - 在 Vue 中跨组件共享模板
- hibernate - Hibernate 中的版本检查
- java - 将 Notes 字段转换为 JsonJavaArray
- c# - 无法选择最佳候选函数。您可能需要在 Postgres 中添加显式类型转换
- java - 安卓弹簧按钮
- opencv - 使用 dlib 检测眼睛地标