簡體   English   中英

Jaxb Unmarshall帶有未知的@XmlRootElement

[英]Jaxb Unmarshall with an unknown @XmlRootElement

在不知道根元素的情況下,我無法實現解組 XML。 例如。

<foo>
   <bar/>
</foo>

要么

<bar>
   <bar/>
</bar>

等等...

我想在類上映射解組結果:

// @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 = "<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());
    }
}

有用!

哪個XML傳遞確實有一個根元素,你提到的xml有兩個文件

<foo>
  <bar/>
</foo>

要么

<bar>
 <bar/>

所以在這里你有兩個根名稱foo或bar,所以為每個創建兩個類,如果它將調用該類的根名稱

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM