Verwenden Sie JAXB, um ein Objekt aus einer XML-Zeichenfolge zu erstellen

Lesezeit: 3 Minuten

Benutzer-Avatar
c12

Wie kann ich den folgenden Code verwenden, um eine XML-Zeichenfolge zu entpacken und sie dem unten stehenden JAXB-Objekt zuzuordnen?

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

Um XML-Inhalt zu übergeben, müssen Sie den Inhalt in eine einschließen Readerund entpacken Sie das stattdessen:

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

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

  • Könnten Sie diese Antwort erweitern, um einzubeziehen, ob die “XML-Zeichenfolge hier” einen SOAP-Umschlag enthält?

    – JWiley

    11. März 2014 um 14:25 Uhr

  • Was wäre, wenn Sie a verwenden wollten Reader in Kombination mit einer bestimmten Bohnenklasse ? Da es keine gibt unmarshall(Reader, Class) Methode. Gibt es zB eine Möglichkeit die umzuwandeln Reader zu einem javax.xml.transform.Source ?

    – bvdb

    13. Juli 2016 um 10:29 Uhr

  • In meinem Fall arbeiten als: JAXBElement<MyObject> elemento = (JAXBElement<MyObject>)unmarshaller.unmarshal(reader); MyObject object = elemento.getValue();

    – Cesar Miguel

    12. Januar 2017 um 0:26 Uhr


  • @bvdb Sie können verwenden javax.xml.transform.stream.StreamSource die Konstruktoren hat, die nehmen Reader, Fileoder InputStream.

    – Muhd

    22. Dezember 2017 um 6:49 Uhr

  • Vielen Dank! In meinem Fall musste ich etwas anders vorgehen: Person person = (Person) ((JAXBElement) unmarshaller.unmarshal(reader)).getValue();

    – Gustavo Amaro

    8. Mai 2020 um 11:21 Uhr


Oder wenn Sie einen einfachen Einzeiler wollen:

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

  • Dies sollte die akzeptierte Antwort sein. Das ist etwas unkomplizierter.

    – Bobbel

    22. April 2016 um 12:08 Uhr

  • Sehr einfach. Ich stimme voll und ganz zu, es muss die akzeptierte Antwort sein.

    – Afaria

    17. Juni 2016 um 15:31 Uhr

  • Ich kann den obigen Kommentaren eigentlich nicht zustimmen. Es ist sicherlich einfacher, aber es erstellt den Kontext spontan, sodass es Auswirkungen auf die Leistung haben kann, selbst wenn der Kontext zwischengespeichert wird. Mit Vorsicht verwenden.

    – Schreistark

    2. Februar 2017 um 16:02 Uhr

  • Was ist also die Alternative, wenn wir dem Unmarshaller eine Klasse zur Verfügung stellen wollen? Die einzige Methode nimmt einen (Knoten, Klasse) im Parameter und hier haben wir einen String.

    – Karl Follet

    14. April 2017 um 13:34 Uhr


  • Mit dieser kompakten Version erhalte ich keine Parsing-Fehler, was nützlich ist, um eine Konfiguration zu debuggen. Wahrscheinlich übersehe ich etwas…

    – Biber

    23. Mai 2018 um 10:00 Uhr


Es gibt kein unmarshal(String) Methode. Sie sollten eine verwenden Reader:

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

Aber normalerweise bekommen Sie diese Zeichenfolge irgendwoher, zum Beispiel aus einer Datei. Wenn das der Fall ist, pass besser auf FileReader selbst.

Wenn Sie bereits die XML-Datei haben und mehr als ein Attribut enthält, können Sie wie folgt damit umgehen:

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

die Methode getCharacterDataFromElement ist

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

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

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

1350950cookie-checkVerwenden Sie JAXB, um ein Objekt aus einer XML-Zeichenfolge zu erstellen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy