XML Dizesinden Nesne oluşturmak için JAXB kullanma


174

Bir XML dizgisini aşağıdaki JAXB nesnesiyle eşleştirmek için aşağıdaki kodu nasıl kullanabilirim?

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

Yanıtlar:


282

XML içeriğini iletmek için içeriği Readera'ya sarmanız ve bunun yerine şunu kaldırmanız gerekir :

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

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

6
Bu yanıtı, "xml dizesi" bir SOAP zarfı içeriyorsa içerecek şekilde genişletebilir misiniz?
JWiley

Readerbelirli bir fasulye sınıfıyla kombinasyon halinde kullanmak isterseniz ne olur ? unmarshall(Reader, Class)Yöntem olmadığı için . Örneğin dönüştürmek için bir yol yoktur Readera javax.xml.transform.Source?
bvdb

2
Benim durumumda şu şekilde çalışır:JAXBElement<MyObject> elemento = (JAXBElement<MyObject>)unmarshaller.unmarshal(reader); MyObject object = elemento.getValue();
Cesar Miguel

1
@bvdb kullanabilirsiniz javax.xml.transform.stream.StreamSourcealmak oluşturucusu yok ki Reader, Fileya InputStream.
Muhd

Teşekkürler! Benim durumumda biraz farklı yapmam gerekiyordu: Kişi kişi = (Kişi) ((JAXBElement) unmarshaller.unmarshal (okuyucu)). GetValue ();
Gustavo Amaro

162

Veya basit bir tek astar istiyorsanız:

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

1
Bu kabul edilen cevap olmalı. Bu biraz daha az karmaşık.
bobbel

Çok basit. Tamamen katılıyorum, kabul edilen cevap olmalı.
Afaria

5
Aslında yukarıdaki yorumlara katılmıyorum. Kesinlikle daha kolay ama bağlamı anında oluşturur, böylece bağlam önbelleğe alınsa bile performans etkileri olabilir. Dikkatle kullanın.
Crystark

Eđer eţsiz olana bir sýnýf vermek istersek alternatif nedir? Tek yöntem parametre içinde bir (düğüm, sınıf) almak ve burada bir dize var.
Charles Follet

Bu özlü sürümde, bir yapılandırmada hata ayıklamak için yararlı olan ayrıştırma hataları almıyorum. Muhtemelen bir şey özlüyorum ...
Kunduz

21

Herhangi bir unmarshal(String)yöntem yok . Kullanmanız gerekenler Reader:

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

Ancak genellikle bu dizeyi bir yerden, örneğin bir dosyadan alıyorsunuz. Eğer durum buysa, FileReaderkendini geçsen iyi olur .


3

Zaten xml'niz varsa ve birden fazla öznitelik gelirse, aşağıdaki gibi işleyebilirsiniz:

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

getCharacterDataFromElement yöntemi

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

return cd.getData();
}
return "";
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.