如何将xml字符串转换为对象。我不知道提前是什么对象。只是几个可能性

时间:2013-03-29 17:49:35

标签: java jaxb

我有一个字符串,它是一个XML字符串,它可以对应于jaxb生成的模式文件的几个对象之一。
我不知道它提前是什么对象。

  • 如何将此XML字符串转换为jaxb xml对象?某种类型的解组?
  • 如何确定分配给哪个对象?
  • 如何将对象从xml字符串转换为对象后,如何实例化该对象?

4 个答案:

答案 0 :(得分:3)

您可以执行以下操作:

<强>富

只要通过@XmlRootElement@XmlElementDecl注释存在与您的类关联的根元素,您就不需要指定要解组的类的类型(请参阅:{{3 }})。

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Foo {

    private String bar;

    public String getBar() {
        return bar;
    }

    public void setBar(String bar) {
        this.bar = bar;
    }

}

<强>演示

要从String解组,只需将String包裹在StringReader的实例中。 unmarshal操作会将XML转换为域类的实例。如果您不知道哪个班级必须使用instanceofgetClass()来确定它是什么类型。

import java.io.StringReader;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Foo.class);

        String xml = "<foo><bar>Hello World</bar></foo>";
        StringReader reader = new StringReader(xml);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        Object result = unmarshaller.unmarshal(reader);

        if(result instanceof Foo) {
            Foo foo = (Foo) result;
            System.out.println(foo.getBar());
        }
    }

}

<强>输出

Hello World

答案 1 :(得分:0)

Unmarshaller yourunmarshaller = JAXBContext.NewInstance(yourClass).createUnMarshaller();
JAXBElement<YourType> jaxb = (yourunmarshaller).unmarshal(XMLUtils.getStringSource([your object]), [the class of your object].class);

答案 2 :(得分:0)

如果您拥有XML对象的模式文件,那么在使用JAXB时就是如此,请在XML上运行验证。

Java XML validation against XSD Schema

答案 3 :(得分:0)

如果从XSD生成对象,则JAXB在与所有类型类相同的包中生成ObjectFactory类。

JAXBContext jaxbContext = JAXBContext.newInstance("your.package.name");
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();

这里“your.package.name”代表ObjectFactory类的包名。

unmarshaller现在可以将您的XML转换为对象:

public Object createObjectFromString(String messageBody) throws JAXBException {
    return unmarshaller.unmarshal(new StringReader(messageBody));
}

如果成功,将返回JAXBElement对象:

try {
    JAXBElement jaxbElement= (JAXBElement) createObjectFromString(messageBody);
} catch (JAXBException e) {
    // unmarshalling was not successful, take care of the return object 
}

如果您返回了jaxbElement个对象,则可以为getValue()的包裹对象调用getDeclaredType()

使用此方法,您无需事先知道目标对象的类型。