簡體   English   中英

將具有不同rootelement名稱的兩個xml映射到同一java對象

[英]mapping two xmls with different rootelement name to the same java object

我有

xml1:
<abc><name>hello</name></abc>

xml2
<xyz><name>hello</name></xyz>

I have one java class. 

@XmlRootElement(name="abc") (this 
public class Foo{
   @XmlElement
   String name;
}

我不想要另一個類,但是想讓Foo類本身適應xml2。 我可以在預編組/預解組期間進行攔截或修改。

謝謝!

}

取決於您所說的“我不想再上一堂課”,也許這對您有用:

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSeeAlso;
import java.io.StringReader;

public class JaxbBindTwoRootElementsToSameClass {
    public static void main(String[] args) throws Exception {
        String xml1 = "<abc><name>hello</name></abc>";
        String xml2 = "<xyz><name>hello</name></xyz>";
        Unmarshaller unmarshaller = JAXBContext.newInstance(Foo.class).createUnmarshaller();
        Object o1 = unmarshaller.unmarshal(new StringReader(xml1));
        Object o2 = unmarshaller.unmarshal(new StringReader(xml2));
        System.out.println(o1);
        System.out.println(o2);
    }

    @XmlSeeAlso({Foo.Foo_1.class, Foo.Foo_2.class})
    static class Foo {
        @XmlRootElement(name = "abc")
        static class Foo_1 extends Foo {}

        @XmlRootElement(name = "xyz")
        static class Foo_2 extends Foo {}

        @XmlElement
        String name;

        @Override
        public String toString() {
            return "Foo{name='" + name + '\'' + '}';
        }
    }
}

輸出:

Foo{name='hello'}
Foo{name='hello'}

它的好處是幾乎可以像平常一樣使用JAXB。 這只是一個有點非常規的班級組織。 創建Foo.class ,甚至只需將其傳遞給JAXBContext即可。 無需修補JAXB內部。

解組

您可以使用帶有類參數的解組方法。 當指定一個類時,JAXB實現不需要使用root元素來確定要解組的類。

編組

封送處理時,可以將根對象包裝在JAXBElement中以提供根元素信息。

暫無
暫無

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

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