gpt4 book ai didi

java - 使用 XMLEventReader 从子节点解码时出现 IllegalStateException

转载 作者:数据小太阳 更新时间:2023-10-29 02:29:45 35 4
gpt4 key购买 nike

我在处理一些 .xml 时遇到了一个以前从未见过 的异常。这是损坏的代码:

public class UnmarshallProva {

public static void main(String[] args) {
JAXBContext jaxbCx;
Unmarshaller mavByXml;
FileReader fr;
XMLInputFactory xif;
XMLEventReader xer;
int mavv = 0;
try {
jaxbCx = JAXBContext.newInstance(MavType.class);
mavByXml = jaxbCx.createUnmarshaller();
fr = new FileReader(new File(args[0]));
xif = XMLInputFactory.newFactory();
xer = xif.createXMLEventReader(fr);

while(xer.hasNext()) {
XMLEvent xe = xer.nextEvent();
if(xe.isStartElement()) {
if(xe.asStartElement().getName().getLocalPart().equals("mav")) {
if(xer.peek() != null) {
mavByXml.unmarshal(xer, MavType.class).getValue();
}
mavv++;
}
}
}
System.out.println(UnmarshallProva.class.getName()+" DONE. "+mavv+" MAv.");

} catch (JAXBException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (XMLStreamException e) {
e.printStackTrace();
}
}

类(class)MavTypexjc 生成命令。作为XMLEventReader找到第一个 <mav>标记,它会尝试解码并返回此异常:

java.lang.IllegalStateException: reader must be on a START_ELEMENT event, not a 4 event
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:449)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:430)
at prove.UnmarshallProva.main(UnmarshallProva.java:38)

仍然很困惑为什么这不起作用。

最佳答案

原因

XMLEventReader 没有获取当前事件的方法,因此当您将它传递给 Unmarshaller 时,它会请求下一个事件(它可以获取您已经使用 xer.nextEvent() 请求的 XMLEvent

你能做什么

您可以更改您的 while 逻辑来执行以下操作:

    while(xer.hasNext()) {
XMLEvent xe = xer.peek(); // CHANGE
if(xe.isStartElement()) {
if(xe.asStartElement().getName().getLocalPart().equals("mav")) {
// if(xer.peek() != null) {
mavByXml.unmarshal(xer, MavType.class).getValue();
// }
mavv++;
}
}
// NEW
if(xer.hasNext()) {
xer.nextTag();
}
}

我会怎么做

我建议使用 XMLStreamReader 来获得您正在寻找的行为。我的博客上有一个完整的示例,您可能会发现它很有用:

关于java - 使用 XMLEventReader 从子节点解码时出现 IllegalStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28860131/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com