2011-03-28 23 views
132

¿Cómo puedo usar el siguiente código para desmarcar una cadena XML y asignarla al objeto JAXB a continuación?Utilice JAXB para crear objetos a partir de la cadena XML

JAXBContext jaxbContext = JAXBContext.newInstance(Person.class); 
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 
Person person = (Person) unmarshaller.unmarshal("xml string here"); 

@XmlRootElement(name = "Person") 
public class Person { 
    @XmlElement(name = "First-Name") 
    String firstName; 
    @XmlElement(name = "Last-Name") 
    String lastName; 
    public String getFirstName() { 
     return firstName; 
    } 
    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 
    public String getLastName() { 
     return lastName; 
    } 
    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 
} 

Respuesta

222

Para pasar el contenido XML, es necesario para envolver el contenido en un Reader, y que en lugar unmarshal:

JAXBContext jaxbContext = JAXBContext.newInstance(Person.class); 
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 

StringReader reader = new StringReader("xml string here"); 
Person person = (Person) unmarshaller.unmarshal(reader); 
+4

¿Podría ampliar esta respuesta para incluir si la "cadena xml aquí" incluye un sobre SOAP? – JWiley

+0

¿Qué sucede si quiere usar un 'Reader' en combinación con una clase específica de bean? Dado que no existe el método 'unmarshall (Reader, Class)'. P.ej. ¿Hay alguna manera de convertir el 'Reader' a' javax.xml.transform.Source'? – bvdb

+0

En mi caso trabajo como: 'JAXBElement elemento = (JAXBElement ) unmarshaller.unmarshal (reader); MyObject object = elemento.getValue(); ' –

20

No hay unmarshal(String) método. Debe utilizar un Reader:

Person person = (Person) unmarshaller.unmarshal(new StringReader("xml string")); 

Pero por lo general está consiguiendo esa cadena de algún lugar, por ejemplo, un archivo. Si ese es el caso, mejor pase el FileReader.

119

O si quieres un sencillo de una sola línea:

Person person = JAXB.unmarshal(new StringReader("<?xml ..."), Person.class); 
+1

Esta debería ser la respuesta aceptada. Eso es un poco menos complicado. – bobbel

+0

Muy simple. Estoy totalmente de acuerdo, debe ser la respuesta aceptada. – Afaria

+2

En realidad estoy en desacuerdo con los comentarios anteriores. Sin duda es más fácil, pero crea el contexto sobre la marcha, por lo que puede tener un impacto en el rendimiento, incluso si el contexto termina en la memoria caché. Usar con precaución. – Crystark

3

Si ya tiene el xml, y viene más de un atributo, puede manejar la situación de la siguiente manera:

String output = "<ciudads><ciudad><idCiudad>1</idCiudad> 
<nomCiudad>BOGOTA</nomCiudad></ciudad><ciudad><idCiudad>6</idCiudad> 
<nomCiudad>Pereira</nomCiudad></ciudads>"; 
DocumentBuilder db = DocumentBuilderFactory.newInstance() 
    .newDocumentBuilder(); 
InputSource is = new InputSource(); 
is.setCharacterStream(new StringReader(output)); 

Document doc = db.parse(is); 
NodeList nodes = ((org.w3c.dom.Document) doc) 
    .getElementsByTagName("ciudad"); 

for (int i = 0; i < nodes.getLength(); i++) {   
    Ciudad ciudad = new Ciudad(); 
    Element element = (Element) nodes.item(i); 

    NodeList name = element.getElementsByTagName("idCiudad"); 
    Element element2 = (Element) name.item(0); 
    ciudad.setIdCiudad(Integer 
     .valueOf(getCharacterDataFromElement(element2))); 

    NodeList title = element.getElementsByTagName("nomCiudad"); 
    element2 = (Element) title.item(0); 
    ciudad.setNombre(getCharacterDataFromElement(element2)); 

    ciudades.getPartnerAccount().add(ciudad); 
} 
} 

for (Ciudad ciudad1 : ciudades.getPartnerAccount()) { 
System.out.println(ciudad1.getIdCiudad()); 
System.out.println(ciudad1.getNombre()); 
} 

la método getCharacterDataFromElement es

public static String getCharacterDataFromElement(Element e) { 
Node child = e.getFirstChild(); 
if (child instanceof CharacterData) { 
CharacterData cd = (CharacterData) child; 

return cd.getData(); 
} 
return ""; 
} 
Cuestiones relacionadas