I have created three JAXB class : Home , Person , Animal
. Java Class
Home have variable List<Object> any
that may contain Person and/or Animal instance .
public class Home {
@XmlAnyElement(lax = true)
protected List<Object> any;
//setter getter also implemented
}
@XmlRootElement(name = "Person") // Edited
public class Person {
protected String name; //setter getter also implemented
}
@XmlRootElement(name = "Animal") // Edited
public class Animal {
protected String name; //setter getter also implemented
}
/* After Unmarshalling */
Home home ;
for(Object obj : home .getAny()){
if(obj instanceof Person ){
Person person = (Person )obj;
// .........
}else if(obj instanceof Animal ){
Animal animal = (Animal )obj;
// .........
}
}
I need to achieve Person or Animal
object saved in "Home.any" List
variable but content of "Home.any" List
is instance of com.sun.org.apache.xerces.internal.dom.ElementNSImpl
instead of Animal or Person
.
So is there a way to achieve Animal or Person
instance that is saved in xml in "Home.any" List
.
JAXB definitionsMarshalling is the process of transforming Java objects into XML documents. Unmarshalling is the process of reading XML documents into Java objects. The JAXBContext class provides the client's entry point to the JAXB API.
Annotation Type XmlAnyElementMaps a JavaBean property to XML infoset representation and/or JAXB element. This annotation serves as a "catch-all" property while unmarshalling xml content into a instance of a JAXB annotated class.
You need to add @XmlRootElement
on the classes you want to appear as instances in the field/property you have annotated with @XmlAnyElement(lax=true)
.
Home
import java.util.List;
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
public class Home {
@XmlAnyElement(lax = true)
protected List<Object> any;
//setter getter also implemented
}
Person
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name="Person")
public class Person {
}
Animal
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name="Animal")
public class Animal {
}
input.xml
<?xml version="1.0" encoding="UTF-8"?>
<root>
<Person/>
<Animal/>
<Person/>
</root>
Demo
import javax.xml.bind.*;
import javax.xml.transform.stream.StreamSource;
public class Demo {
public static void main(String[] args) throws JAXBException {
JAXBContext jc = JAXBContext.newInstance(Home.class, Person.class, Animal.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
StreamSource xml = new StreamSource("src/forum20329510/input.xml");
Home home = unmarshaller.unmarshal(xml, Home.class).getValue();
for(Object object : home.any) {
System.out.println(object.getClass());
}
}
}
Output
class forum20329510.Person
class forum20329510.Animal
class forum20329510.Person
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With