有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Jaxb与未知@XmlRootElement解组

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

<foo>
   <bar/>
</foo>

或者

<bar>
   <bar/>
</bar>

等等

我想将解组结果映射到一个类,比如:

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

我总是被要求修复@XmlRootElement
我搜索了如何在运行时设置@XmlRootElement,但没有成功。知道吗

我处于Spring批处理环境中,可以使用我选择的解组器

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


共 (2) 个答案

  1. # 1 楼答案

    调整了他的方法: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());
        }
    }
    

    真管用

  2. # 2 楼答案

    您传递的哪个XML有根元素,您提到的XML有两个文件

    <foo>
      <bar/>
    </foo>
    

    或者

    <bar>
     <bar/>
    

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