3

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

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

4 回答 4

5

您可以执行以下操作:

只要有一个通过@XmlRootElement@XmlElementDecl注释与您的类相关联的根元素,您就不需要指定要解组的类的类型(请参阅: http ://blog.bdoughan.com/2012/07/jaxb-和-root-elements.html)。

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
于 2013-03-29T18:44:03.000 回答
0
Unmarshaller yourunmarshaller = JAXBContext.NewInstance(yourClass).createUnMarshaller();
JAXBElement<YourType> jaxb = (yourunmarshaller).unmarshal(XMLUtils.getStringSource([your object]), [the class of your object].class);
于 2013-03-29T18:04:19.997 回答
0

如果您有 XML 对象的模式文件(如果您正在使用 JAXB),请在 XML 上运行验证。

针对 XSD Schema 的 Java XML 验证

于 2013-03-29T18:15:46.387 回答
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()或者它的类。

使用这种方法,您无需提前知道目标对象的类型。

于 2018-05-15T12:57:57.960 回答