JAXB:解组不同的xml到同一个对象
问题描述:
我有3个输入XML,它们几乎都具有相同的元素和属性,实际上它们表示相同的东西,所以我想将它们编组到相同的对象,类似于这样的:JAXB:解组不同的xml到同一个对象
请求一:
<?xml version="1.0" encoding="UTF-8"?>
<RequestOne>
<id>123</id>
<name>foo</name>
</RequestOne>
请求二:
<?xml version="1.0" encoding="UTF-8"?>
<RequestTwo>
<id>123</id>
<value>val</value>
</RequestTwo>
要求三:
<?xml version="1.0" encoding="UTF-8"?>
<RequestThree>
<name>foo</name>
<value>val</value>
</RequestThree>
所需的对象(像):
@XmlRootElement
public class Resource{
@XmlElement
private String id;
@XmlElement
private String name;
@XmlElement
private String value;
//(...) more code
}
但我不能使用多个rootElement的注解问JAXB所有3请求解组的类Resource
的对象有一种方法来做到这一点?或者我必须做3个Sepparated类?
感谢您使用重载的通用unmarshal
方法的帮助
答
选项1
解组:
public static class Base {
private String name ;
@XmlElement(name = "name")
public String getName() {
return name;
}
public Base setName(String name) {
this.name = name;
return this;
}
}
public static void main (String [] args) throws JAXBException {
JAXBContext jaxbContext = JAXBContext.newInstance(Base.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
JAXBElement<Base> basea = unmarshaller.unmarshal(new StreamSource(new StringReader("<RootA><name>nanana</name></RootA>")), Base.class);
System.out.println(basea.getValue().getName());
JAXBElement<Base> baseb = unmarshaller.unmarshal(new StreamSource(new StringReader("<RootB><name>nbnbnb</name></RootB>")), Base.class);
System.out.println(baseb.getValue().getName());
}
选项2
您可以随时使用Java的类子类型功能吗? JAXB也对父类进行注释扫描。这个例子的作品
public static class Base {
private String name ;
@XmlElement(name = "name")
public String getName() {
return name;
}
public Base setName(String name) {
this.name = name;
return this;
}
}
@XmlRootElement(name = "RootA")
public static class RootA extends Base{
}
@XmlRootElement(name = "RootB")
public static class RootB extends Base {
}
public static void main (String [] args) throws JAXBException {
JAXBContext jaxbContext = JAXBContext.newInstance(RootA.class,RootB.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
RootA rootA = (RootA)unmarshaller.unmarshal(new StringReader("<RootA><name>nanana</name></RootA>"));
System.out.println(rootA.getName());
RootB rootB = (RootB)unmarshaller.unmarshal(new StringReader("<RootB><name>nbnbnb</name></RootB>"));
System.out.println(rootB.getName());
}
非常感谢,我用第一个选项,并完美地工作:D – Numpakov