有没有办法在运行时决定将我的XML解组为哪个java类?
我用这种方式试过Unmarshall代码 -
public Object unmarshallXml(String xmlReq, String className)
{
String myClass = className+".class";
Object instances = null;
try {
JAXBContext jc = JAXBContext.newInstance( myClass );
Unmarshaller u = jc.createUnmarshaller();
StringBuffer xmlStr = new StringBuffer( xmlReq );
StringReader strReader = new StringReader( xmlStr.toString() );
StreamSource strSource = new StreamSource(strReader);
Object o = u.unmarshal( strSource );
} catch (JAXBException e) {
e.printStackTrace();
}
return instances;
}
但得到了这个错误 -
" javax.xml.bind.JAXBException: "LookupInstances.class" doesnt contain ObjectFactory.class or jaxb.index"
答案 0 :(得分:3)
我们可以在解组时在运行时决定jaxb类吗?
是的,您只需要使用unmarshal
参数之一的Class
方法。
构建JAXBContext
仅仅因为你想要解组课程Foo
并不一定意味着你可以JAXBContext.createContext(Foo.class)
。这是因为可能还有其他类需要无法通过该类传递(ObjectFactory
)是一个很好的例子。
您可以在包名称上创建JAXBContext
,但这需要以下之一:
ObjectFactory
的注释为@XmlRegistry
的类位于该包中,其中包含指向模型的足够指针以引入所有必需的类。如果您从XML Schema生成模型,那么将为您完成。ObjectFactory
类,则可以包含一个名为jaxb.index
的文本文件,其中包含一个回车分隔的模型短类名列表。JAXBContext
需要从冒号分隔的上下文路径引导,其中包含的每个包满足上述两个条件之一。答案 1 :(得分:2)
根据Unmarshaller的API,您可以致电u.unmarshal(strSource, Foo.class)
,这将返回JAXBElement<Foo>
,您可以在其上调用getValue()
以获取实际Foo
}}
另外,请阅读JAXBContext
的使用情况。你可能想把它传递给一个包而不是一个类 - 但你没有包含足够的上下文(哈哈)让我确定。
答案 2 :(得分:0)
另一个解决方案可以是 -
public Object unmarshallXml(String xmlReq, Object obj) {
//ClientVariables instances = null;
Object o = null;
try {
JAXBContext jc = JAXBContext.newInstance(obj.getClass());
Unmarshaller u = jc.createUnmarshaller();
StringBuffer xmlStr = new StringBuffer(xmlReq);
StringReader strReader = new StringReader(xmlStr.toString());
StreamSource strSource = new StreamSource(strReader);
o = u.unmarshal(strSource);
//instances = (ClientVariables) o;
} catch (JAXBException e) {
e.printStackTrace();
}
return o;
}
可以这样打电话 -
Utility util = new Utility();
LookupInstances instances = new LookupInstances();
instances = (LookupInstances) util.unmarshallXml(xmlReq, instances);