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

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.

  Happy Days Daycare Apple Street   Adams  Child1 Child2    Adams  Child3 Child4     Child5 Child6   

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 families; @XmlElementWrapper(name="RemainingChildList") @XmlElement(name="ChildID") private List 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 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

   Happy Days Daycare Apple Street   Adams  Child1 Child2    Adams  Child3 Child4     Child5 Child6   

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(); } 

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.