Jaxb Unmarshall带有未知的@XmlRootElement

在不知道根元素的情况下,我无法实现解组 XML。 例如。

   

要么

    

等等…

我想在类上映射解组结果:

 // @XmlRootElement ?? public class Container implements Serializable { private Bar bar; } 

我总是需要修复@XmlRootElement
我搜索了如何在运行时设置@XmlRootElement但没有成功。 任何想法?

我在Spring Batch上下文中,我可以使用我选择的unmarshaller。

注意:我不能使用@XmlElementDeclObjectFactory ,如下所示,因为我不知道可能的根名称的名称

改编他的方法: https : //stackoverflow.com/a/33824472/181336

 import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBElement; import javax.xml.bind.Unmarshaller; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.transform.stream.StreamSource; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.Serializable; public class Test { @XmlAccessorType(XmlAccessType.PROPERTY) public static class Bar { private String name; public String getName() { return name; } @XmlElement public void setName(String name) { this.name = name; } } @XmlAccessorType(XmlAccessType.PROPERTY) public static class Container implements Serializable { private Bar bar; public Bar getBar() { return bar; } @XmlElement public void setBar(Bar bar) { this.bar = bar; } } public static void main(String[] args) throws Exception { JAXBContext jaxbContext = JAXBContext.newInstance(Container.class); String xml = "Barry"; Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); InputStream is = new ByteArrayInputStream(xml.getBytes()); JAXBElement barWrapperElement = unmarshaller.unmarshal(new StreamSource(is), Container.class); Container container = barWrapperElement.getValue(); System.out.println(container.getBar().getName()); } } 

有用!

你传递的XML确实有一个根元素,你提到的xml有两个文件

    

要么

   

所以在这里你有两个根名称foo或bar,所以为每个创建两个类,如果它将调用该类的根名称