xmlrootelement unmarshal parse jaxbunmarshaller jaxbcontext example bean java xml jaxb

unmarshal - jaxbcontext java example



¿Cómo puedo analizar este XML en Java con JAXB? (3)

Este parece ser un buen tutorial para hacer esto

http://blog.espenberntsen.net/2010/02/26/generate-jaxb-classes-from-an-xsd-schema-and-the-schema-from-an-xml-sample-document/

Detalla cómo generar un esquema xsd desde y un archivo xml y luego cómo usar ese esquema para generar clases jaxb. Al final, deberías terminar con más de una clase.

Tengo el siguiente XML, sin XSD o esquema con él que quiero analizar a los objetos java utilizando JAXB como escuché es mejor que SAX. ¿Hay alguna manera de lograr esto con anotaciones o una mejor manera de hacer esto? ¿Lo hace para que solo necesite una sola clase de FosterHome? Tengo problemas para encontrar cómo hacer esto. Cualquier ayuda es agradecida.

Originalmente estaba pensando en tener una clase FosterHome, Family y Child. Usar JAXB, ¿tener 3 clases ya no es necesario? No estoy seguro de cómo lidiar con esto ya que ChildID aparece en dos áreas diferentes.

<?xml version="1.0" encoding="UTF-8"?> <FosterHome> <Orphanage>Happy Days Daycare</Orphanage> <Location>Apple Street</Location> <Families> <Family> <ParentID>Adams</ParentID> <ChildList> <ChildID>Child1</ChildID> <ChildID>Child2</ChildID> </ChildList> </Family> <Family> <ParentID>Adams</ParentID> <ChildList> <ChildID>Child3</ChildID> <ChildID>Child4</ChildID> </ChildList> </Family> </Families> <RemainingChildList> <ChildID>Child5</ChildID> <ChildID>Child6</ChildID> </RemainingChildList> </FosterHome>


Podrías hacer lo siguiente. Al aprovechar @XmlElementWrapper , puede reducir la cantidad de clases que necesita:

FosterHome

package nov18; import java.util.List; import javax.xml.bind.annotation.*; @XmlRootElement(name="FosterHome") @XmlAccessorType(XmlAccessType.FIELD) public class FosterHome { @XmlElement(name="Orphanage") private String orphanage; @XmlElement(name="Location") private String location; @XmlElementWrapper(name="Families") @XmlElement(name="Family") private List<Family> families; @XmlElementWrapper(name="RemainingChildList") @XmlElement(name="ChildID") private List<String> remainingChildren; }

Familia

package nov18; import java.util.List; import javax.xml.bind.annotation.*; @XmlAccessorType(XmlAccessType.FIELD) public class Family { @XmlElement(name="ParentID") private String parentID; @XmlElementWrapper(name="ChildList") @XmlElement(name="ChildID") private List<String> childList; }

Manifestación

package nov18; import java.io.File; import javax.xml.bind.*; public class Demo { public static void main(String[] args) throws Exception { JAXBContext jc = JAXBContext.newInstance(FosterHome.class); Unmarshaller unmarshaller = jc.createUnmarshaller(); FosterHome fosterHome = (FosterHome) unmarshaller.unmarshal(new File("src/nov18/input.xml")); Marshaller marshaller = jc.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.marshal(fosterHome, System.out); } }

De entrada y salida

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <FosterHome> <Orphanage>Happy Days Daycare</Orphanage> <Location>Apple Street</Location> <Families> <Family> <ParentID>Adams</ParentID> <ChildList> <ChildID>Child1</ChildID> <ChildID>Child2</ChildID> </ChildList> </Family> <Family> <ParentID>Adams</ParentID> <ChildList> <ChildID>Child3</ChildID> <ChildID>Child4</ChildID> </ChildList> </Family> </Families> <RemainingChildList> <ChildID>Child5</ChildID> <ChildID>Child6</ChildID> </RemainingChildList> </FosterHome>

Para más información

ACTUALIZAR

¿Existe alguna manera fácil de iterar / imprimir todo el ChildID en la clase familiar?

Usted podría hacer lo siguiente:

for(Family family : fosterHome.getFamilies()) { System.out.println(family.getParentID()); for(String childID : family.getChildList()) { System.out.println(" " + childID); } }


try { // create a JAXBContext capable of handling classes generated into // the com.abhi.xml.jaxb.generated package JAXBContext jc = JAXBContext.newInstance( "com.abhi.xml.jaxb.generated" ); // create an Unmarshaller Unmarshaller u = jc.createUnmarshaller(); // unmarshal a FosterHome instance document into a tree of Java content // objects composed of classes from the com.abhi.xml.jaxb.generated // package. JAXBElement<?> fhElement =(JAXBElement<?>)u.unmarshal (new FileInputStream("yourfile.xml")); FosterHome FH = (FosterHome)fhElement.getValue(); System.out.println(FH.getDesc()); // so on ..you can get all elements based on generated objects } catch( JAXBException je ) { je.printStackTrace(); } catch( IOException ioe ) { ioe.printStackTrace(); }