JAXB를 사용하여 XML 문자열에서 오브젝트 작성


174

아래 코드를 사용하여 XML 문자열을 비 정렬 화하여 아래 JAXB 객체에 매핑하는 방법은 무엇입니까?

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

답변:


282

XML 컨텐츠를 전달하려면에서 컨텐츠를 랩핑하고 Reader대신 마샬링 해제해야합니다.

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

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

6
"xml string here"에 SOAP 엔벨로프가 포함 된 경우 포함하도록이 답변을 확장 할 수 있습니까?
JWiley

Reader특정 Bean 클래스와 조합 하여 사용하려면 어떻게해야 합니까? unmarshall(Reader, Class)방법 이 없기 때문에 . 예를 들어을로 변환하는 방법 Readerjavax.xml.transform.Source있습니까?
bvdb

2
내 경우에는 다음과 같이 작동합니다.JAXBElement<MyObject> elemento = (JAXBElement<MyObject>)unmarshaller.unmarshal(reader); MyObject object = elemento.getValue();
Cesar Miguel

1
@bvdb 당신은 사용할 수 있습니다 javax.xml.transform.stream.StreamSource걸릴 생성자이있는 Reader, File또는를 InputStream.
Muhd

감사! 내 경우에는 약간 다르게해야했습니다. Person person = (Person) ((JAXBElement) unmarshaller.unmarshal (reader)). getValue ();
Gustavo Amaro

161

또는 간단한 원 라이너를 원한다면 :

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

1
이것이 정답입니다. 조금 덜 복잡합니다.
bobbel

매우 간단합니다. 전적으로 동의합니다. 수락 된 답변이어야합니다.
Afaria

5
나는 실제로 위의 의견에 동의하지 않습니다. 확실히 쉽지만 컨텍스트를 즉시 작성하므로 컨텍스트가 캐시 된 경우에도 성능에 영향을 줄 수 있습니다. 주의해서 사용하십시오.
Crystark

비 정렬 화자에게 수업을 제공하려는 경우 대안은 무엇입니까? 유일한 메소드는 매개 변수에 (노드, 클래스)를 취하며 여기에는 문자열이 있습니다.
Charles Follet

이 간결한 버전을 사용하면 구성을 디버깅하는 데 유용한 구문 분석 오류가 발생하지 않습니다. 아마도 뭔가
Beaver

21

방법이 없습니다 unmarshal(String). 당신은 사용해야합니다 Reader:

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

그러나 일반적으로 파일과 같은 어딘가에서 해당 문자열을 가져옵니다. 이 경우에는 더 잘 전달하십시오 FileReader.


3

이미 xml이 있고 둘 이상의 속성이 있으면 다음과 같이 처리 할 수 ​​있습니다.

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 메소드는

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

return cd.getData();
}
return "";
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.