我有一个字符串,它是一个 XML 字符串,它可能对应于 jaxb 生成的模式文件的几个对象之一。
我提前不知道它是什么对象。
- 如何将此 XML 字符串转换为 jaxb xml 对象?某种类型的解组?
- 如何确定它分配给哪个对象?
- 将对象从 xml 字符串转换为对象后,如何实例化该对象?
您可以执行以下操作:
富
只要有一个通过@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 转换为您的域类的实例。如果您不知道必须使用什么类instanceof
或getClass()
确定它是什么类型。
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
Unmarshaller yourunmarshaller = JAXBContext.NewInstance(yourClass).createUnMarshaller();
JAXBElement<YourType> jaxb = (yourunmarshaller).unmarshal(XMLUtils.getStringSource([your object]), [the class of your object].class);
如果您有 XML 对象的模式文件(如果您正在使用 JAXB),请在 XML 上运行验证。
如果从 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()
或者它的类。
使用这种方法,您无需提前知道目标对象的类型。