我有一个字符串,它是一个XML字符串,它可以对应于jaxb生成的模式文件的几个对象之一。
我不知道它提前是什么对象。
答案 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转换为域类的实例。如果您不知道哪个班级必须使用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
答案 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上运行验证。
答案 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()
。
使用此方法,您无需事先知道目标对象的类型。