首页 文章

Jaxb Unmarshall带有未知的@XmlRootElement

提问于
浏览
3

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

<foo>
   <bar/>
</foo>

要么

<bar>
   <bar/>
</bar>

等等...

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

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

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

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

注意:我不能使用 @XmlElementDeclObjectFactory ,如here所示,因为 I don't know the name of the possibles root names .

2 回答

  • 2

    改编他的方法: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 = "<foo><bar><name>Barry</name></bar></foo>";
            Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
            InputStream is = new ByteArrayInputStream(xml.getBytes());
            JAXBElement<Container> barWrapperElement = unmarshaller.unmarshal(new StreamSource(is), Container.class);
            Container container = barWrapperElement.getValue();
    
            System.out.println(container.getBar().getName());
        }
    }
    

    有用!

  • 0

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

    <foo>
      <bar/>
    </foo>
    

    要么

    <bar>
     <bar/>
    

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

相关问题