Sử dụng JAXB để tạo Đối tượng từ Chuỗi XML


174

Làm cách nào tôi có thể sử dụng mã dưới đây để sắp xếp một chuỗi XML ánh xạ nó tới đối tượng JAXB bên dưới?

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

Câu trả lời:


282

Để truyền nội dung XML, bạn cần phải bọc nội dung trong một Reader, và thay vào đó là:

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

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

6
Bạn có thể mở rộng câu trả lời này để bao gồm nếu "chuỗi xml ở đây" bao gồm một phong bì SOAP không?
JWiley

Điều gì nếu bạn muốn sử dụng Readerkết hợp với một lớp đậu cụ thể? Vì không có unmarshall(Reader, Class)phương pháp. Ví dụ, có cách nào để chuyển đổi Readerthành a javax.xml.transform.Source?
bvdb

2
Trong trường hợp của tôi, công việc là:JAXBElement<MyObject> elemento = (JAXBElement<MyObject>)unmarshaller.unmarshal(reader); MyObject object = elemento.getValue();
Cesar Miguel

1
@bvdb Bạn có thể sử dụng javax.xml.transform.stream.StreamSourcetrong đó có nhà xây dựng mà phải mất Reader, Filehoặc InputStream.
Muhd

Cảm ơn! Trong trường hợp của tôi, tôi cần phải làm một chút khác biệt: Person person = (Person) ((JAXBEuity) unmarshaller.unmarshal (reader)). GetValue ();
Gustavo Amaro

161

Hoặc nếu bạn muốn một lớp lót đơn giản:

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

1
Đây phải là câu trả lời được chấp nhận. Đó là một chút ít phức tạp.
bobbel

Rất đơn giản. Tôi hoàn toàn đồng ý, nó phải là câu trả lời được chấp nhận.
Afaria

5
Tôi thực sự không đồng ý với các ý kiến ​​trên. Nó chắc chắn là dễ dàng hơn nhưng nó tạo ra bối cảnh một cách nhanh chóng để nó có thể có tác động hiệu suất ngay cả khi bối cảnh kết thúc được lưu trữ. Sử dụng cẩn thận.
Crystark

Vì vậy, sự thay thế là gì nếu chúng ta muốn cung cấp một lớp cho unmarshaller? Phương thức duy nhất lấy một (nút, lớp) trong tham số và ở đây chúng ta có một chuỗi.
Charles Follet

Với phiên bản ngắn gọn này, tôi không nhận được lỗi phân tích cú pháp, rất hữu ích để gỡ lỗi cấu hình. Có lẽ tôi đang thiếu thứ gì đó ...
hải ly

21

Không có unmarshal(String)phương pháp. Bạn nên sử dụng một Reader:

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

Nhưng thông thường bạn sẽ nhận được chuỗi đó từ một nơi nào đó, ví dụ như một tệp. Nếu đó là trường hợp, tốt hơn là vượt qua FileReaderchính nó.


3

Nếu bạn đã có xml và có nhiều hơn một thuộc tính, bạn có thể xử lý nó như sau:

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

phương thức getCharacterDataFromEuity là

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

return cd.getData();
}
return "";
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.