Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JAXB Unmarshalling @XmlAnyElement

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.

like image 633
hiddenuser Avatar asked Dec 02 '13 13:12

hiddenuser


People also ask

What is JAXB marshalling and unmarshalling?

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.

What is XmlAnyElement?

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.


1 Answers

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).

Java Model

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 {

}

Demo Code

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

For More Information

  • http://blog.bdoughan.com/2012/12/jaxbs-xmlanyelementlaxtrue-explained.html
like image 117
bdoughan Avatar answered Sep 18 '22 23:09

bdoughan