使用JAXB从XML String创建Object

c12*_*c12 165 java xml jaxb

如何使用以下代码解组XML字符串并将其映射到下面的JAXB对象?

JAXBContext jaxbContext = JAXBContext.newInstance(Person.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Person person = (Person) unmarshaller.unmarshal("xml string here");
Run Code Online (Sandbox Code Playgroud)
@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;
    }
}
Run Code Online (Sandbox Code Playgroud)

ska*_*man 268

要传递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);
Run Code Online (Sandbox Code Playgroud)

  • 您是否可以扩展此答案以包括"xml string here"是否包含SOAP信封? (6认同)
  • 在我的情况下工作为:`JAXBElement<MyObject> elemento = (JAXBElement<MyObject>)unmarshaller.unmarshal(reader); MyObject 对象 = elemento.getValue();` (2认同)

And*_*ejs 157

或者,如果你想要一个简单的单行:

Person person = JAXB.unmarshal(new StringReader("<?xml ..."), Person.class);
Run Code Online (Sandbox Code Playgroud)

  • 我实际上不同意上面的评论.它当然更容易,但它会动态创建上下文,因此即使上下文最终被缓存,它也会产生性能影响.谨慎使用. (4认同)
  • 这应该是公认的答案。这有点不那么复杂。 (2认同)

Boz*_*zho 21

没有unmarshal(String)方法.你应该使用Reader:

Person person = (Person) unmarshaller.unmarshal(new StringReader("xml string"));
Run Code Online (Sandbox Code Playgroud)

但通常你会从某个地方获取该字符串,例如文件.如果是这种情况,最好通过FileReader自己.