В зависимости от того, что именно вы подразумеваете под «Я не хочу другого класса», возможно, это сработает для вас:
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.