[英]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.