我已使用 IntelliJ 工具 > JAXB > 使用 JAXB 从 XML 架构生成 Java 代码从 XSD 创建了 Java 对象...
我基本上尝试从 XSD 生成 Java 对象,然后将符合该 XSD 的 XML 读取到 Java 对象中。
对于我的练习,我使用来自六组网站的与 Credit Transfer 版本 1.10 相关的 XSD。
但是,当我尝试运行以下代码时,我看到一个异常:Java.lang.ClassCastException:javax.xml.bind.JAXBElement无法转换
public class Pain001Tester {
public static void main(String[] args) throws IOException {
String fileName = "pain_001_Beispiel_1.xml";
ClassLoader classLoader = new Pain001Tester().getClass().getClassLoader();
File file = new File(classLoader.getResource(fileName).getFile());
//File is found
System.out.println("File Found : " + file.exists());
//Read File Content
String content = new String(Files.readAllBytes(file.toPath()));
System.out.println(content);
JAXBContext jaxbContext;
try
{
jaxbContext = JAXBContext.newInstance(ObjectFactory.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
ObjectFactory xmlMessage = (ObjectFactory) jaxbUnmarshaller.unmarshal(new StringReader(content));
//ObjectFactory xmlMessage = (ObjectFactory) JAXBIntrospector.getValue(jaxbUnmarshaller.unmarshal(new StringReader(content)));
//JAXBElement<ObjectFactory> userElement = (JAXBElement<ObjectFactory>) jaxbUnmarshaller.unmarshal(new StringReader(content));
//ObjectFactory user = userElement.getValue();
System.out.println(xmlMessage);
}
catch (JAXBException e)
{
e.printStackTrace();
}
}
}
我认为我的问题与 XMLRootElement 有关,但不确定这是否是问题所在。我了解以下 stackoverflow 问题接近我的问题,但无法使用 stackoverflow 案例中突出显示的几个解决方案解决我的问题:No @XmlRootElement generated by JAXB
我假设错误发生在
ObjectFactory xmlMessage = (ObjectFactory) jaxbUnmarshaller.unmarshal(new StringReader(content));
jaxbUnmarshaller.unmarshal() 不返回 ObjectFactoryt 类型,因此您无法将结果强制转换为 ObjectFactory。它返回生成的类的实例,该实例对应于 xml 文件的根元素。
我想我已经找到了问题(赫里先按下按钮,所以他得到了饼干)
我更改了以下内容:
ObjectFactory xmlMessage = (ObjectFactory) JAXBIntrospector.getValue(jaxbUnmarshaller.unmarshal(new StringReader(content)));
到
JAXBElement xmlMessage = (JAXBElement) jaxbUnmarshaller.unmarshal(new StringReader(content));
然后,我没有检索对 ObjectFactory 类的响应,而是使用了 JAXB 生成的根元素类,并且它起作用了。
我不确定为什么用 @XmlRootElement(name = "RootElement") 注释 ObjectFactory 不起作用,但我现在有了一个可行的解决方案。
像下面这样投出你的回应
JAXBElement<OutputType> jaxBElement
然后从中获取对象,如下所示
OutputType outputType=jaxBElement.getValue()
上面的示例应该适合您