188 votes

Utiliser JAXB pour créer un objet à partir d'une chaîne XML

Comment puis-je utiliser le code ci-dessous pour démarshaliser une chaîne XML et la mapper sur l'objet JAXB ci-dessous ?

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

318voto

skaffman Points 197885

Pour transmettre du contenu XML, vous devez envelopper le contenu dans un fichier de type Reader et l'annuler à la place :

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

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

6 votes

Pourriez-vous étendre cette réponse pour inclure si la "chaîne xml ici" inclut une enveloppe SOAP ?

0 votes

Et si vous vouliez utiliser un Reader en combinaison avec une classe de haricot spécifique ? Puisqu'il n'y a pas de unmarshall(Reader, Class) méthode. Par exemple, existe-t-il un moyen de convertir la méthode du Reader à un javax.xml.transform.Source ?

2 votes

Dans mon cas, travailler comme : JAXBElement<MyObject> elemento = (JAXBElement<MyObject>)unmarshaller.unmarshal(reader); MyObject object = elemento.getValue();

175voto

Andrejs Points 4235

Ou si vous voulez une simple phrase :

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

2 votes

Cela devrait être la réponse acceptée. C'est un peu moins compliqué.

0 votes

C'est très simple. Je suis tout à fait d'accord, cela doit être la réponse acceptée.

12 votes

En fait, je ne suis pas d'accord avec les commentaires ci-dessus. C'est certainement plus facile, mais le contexte est créé à la volée, ce qui peut avoir un impact sur les performances, même si le contexte est finalement mis en cache. À utiliser avec précaution.

21voto

Bozho Points 273663

Il n'y a pas unmarshal(String) méthode. Vous devez utiliser une Reader :

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

Mais généralement, vous obtenez cette chaîne de caractères de quelque part, par exemple d'un fichier. Si c'est le cas, il est préférable de passer l'attribut FileReader lui-même.

4voto

Miguel Zapata Points 99

Si vous avez déjà le xml, et qu'il vient plus d'un attribut, vous pouvez le traiter comme suit :

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éthode getCharacterDataFromElement est

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

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

1voto

shweta Points 13
If you want to parse using InputStreams

public Object xmlToObject(String xmlDataString) {
        Object converted = null;
        try {

            JAXBContext jc = JAXBContext.newInstance(Response.class);

            Unmarshaller unmarshaller = jc.createUnmarshaller();
            InputStream stream = new ByteArrayInputStream(xmlDataString.getBytes(StandardCharsets.UTF_8));

            converted = unmarshaller.unmarshal(stream);
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        return converted;
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X