2012-06-27 43 views
32

Tengo el siguiente XML y necesito convertirlo en un objeto java.convertir xml a objeto java utilizando jaxb (unmarshal)

<tests> 
    <test-data> 
     <title>BookTitle</title> 
     <book>BookName</book> 
     <count>64018</count> 
     <test-data> 
      <title>Book title1</title> 
      <book>Book Name1</book> 
      <count>5</count> 
     </test-data> 
     <test-data> 
      <title>Book title2</title> 
      <book>Book Name3</book> 
      <count>5</count> 
     </test-data> 
     <test-data> 
      <title>Book title3</title> 
      <book>Book Name3</book> 
      <count>4</count> 
     </test-data> 
    </test-data> 
</tests> 

No estoy seguro de cuál será mi pojo cuando utilice JAXB para convertirlo.

que crearon los siguientes POJOs según mi entendimiento:

public class Tests { 

    TestData testData; 

    public TestData getTestData() { 
     return testData; 
    } 

    public void setTestData(TestData testData) { 
     this.testData = testData; 
    } 
} 

public class TestData { 
    String title; 
    String book; 
    String count; 

    public String getTitle() { 
     return title; 
    } 
    public void setTitle(String title) { 
     this.title = title; 
    } 
    public String getBook() { 
     return book; 
    } 
    public void setBook(String book) { 
     this.book = book; 
    } 
    public String getCount() { 
     return count; 
    } 
    public void setCount(String count) { 
     this.count = count; 
    } 
} 

por favor me ayude. Gracias de antemano.

+2

No está seguro, está bien. ¿Pero has probado algo? Es más fácil ayudar si ya tienes algo hecho. – buc

+2

Si tiene XSD para este XML, puede generar clases anotadas JAXB con IDE como Eclipse. –

Respuesta

116

Pruebas de

En la clase Tests vamos a añadir una anotación @XmlRootElement. Hacer esto le permitirá a su implementación JAXB saber que cuando un documento comienza con este elemento debe crear una instancia de esta clase. JAXB es configuración por excepción, esto significa que solo necesita agregar anotaciones donde su mapeo difiere del predeterminado. Como la propiedad testData difiere de la asignación predeterminada, utilizaremos la anotación @XmlElement. Usted puede encontrar el siguiente tutorial útil:. http://wiki.eclipse.org/EclipseLink/Examples/MOXy/GettingStarted

package forum11221136; 

import javax.xml.bind.annotation.*; 

@XmlRootElement 
public class Tests { 

    TestData testData; 

    @XmlElement(name="test-data") 
    public TestData getTestData() { 
     return testData; 
    } 

    public void setTestData(TestData testData) { 
     this.testData = testData; 
    } 

} 

TestData

En esta clase utilicé la anotación @XmlType para especificar el orden en el que los elementos deben ser ordenados en añadí una propiedad testData que parecía estar perdido. También usé una anotación @XmlElement por la misma razón que en la clase Tests.

package forum11221136; 

import java.util.List; 
import javax.xml.bind.annotation.*; 

@XmlType(propOrder={"title", "book", "count", "testData"}) 
public class TestData { 
    String title; 
    String book; 
    String count; 
    List<TestData> testData; 

    public String getTitle() { 
     return title; 
    } 
    public void setTitle(String title) { 
     this.title = title; 
    } 
    public String getBook() { 
     return book; 
    } 
    public void setBook(String book) { 
     this.book = book; 
    } 
    public String getCount() { 
     return count; 
    } 
    public void setCount(String count) { 
     this.count = count; 
    } 
    @XmlElement(name="test-data") 
    public List<TestData> getTestData() { 
     return testData; 
    } 
    public void setTestData(List<TestData> testData) { 
     this.testData = testData; 
    } 
} 

demostración

A continuación se muestra un ejemplo de cómo utilizar las API JAXB para leer (unmarshal) el XML y poblar el modelo de dominio y luego escribir (Mariscal) el resultado de nuevo a XML.

package forum11221136; 

import java.io.File; 
import javax.xml.bind.*; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Tests.class); 

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     File xml = new File("src/forum11221136/input.xml"); 
     Tests tests = (Tests) unmarshaller.unmarshal(xml); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(tests, System.out); 
    } 

} 
+24

Deberías aceptar esta respuesta si la lees. –

+0

Desmarcar XML en un objeto Java sin esquema: ¿usa Reflection? En caso afirmativo, ¿cuál es el juego de roles de Reflection in Unmarshalling? – Viswa

Cuestiones relacionadas