2

有什么方法可以在运行时决定我想将 XML 解组到哪个 java 类中?

我尝试以这种方式解组代码 -

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"
4

3 回答 3

3

我们可以在解组期间在运行时决定 jaxb 类吗?

是的,您只需要使用unmarshalClass参数的方法之一。


建设JAXBContext

仅仅因为你想解组这个类Foo并不一定意味着你可以做JAXBContext.createContext(Foo.class). 这是因为可能存在您需要的其他类无法从该类传递(ObjectFactory)就是一个很好的例子。

您可以JAXBContext在包名称上创建 ,但这需要以下之一:

  1. 一个名为ObjectFactoryannotated with的类@XmlRegistry位于该包中,具有足够的指向模型的指针以引入所有必要的类。如果您从 XML 模式生成模型,这将为您完成。
  2. 如果您没有上述ObjectFactory类,则可以包含一个文本文件,该文件jaxb.index使用回车分隔的短类名称列表为您的模型调用。
  3. 您的模型中没有其他包。如果JAXBContext需要从冒号分隔的上下文路径中引导,其中包含的每个包都满足上述两个条件之一。
于 2015-01-20T15:39:23.177 回答
2

根据Unmarshaller的 API ,您可以调用u.unmarshal(strSource, Foo.class)它,这将返回一个JAXBElement<Foo>,您可以调用它getValue()来获取实际的Foo.

此外,请阅读JAXBContextwhile you're at it 的用法。你可能想传递一个包而不是一个类 - 但你没有包含足够的上下文(哈哈)让我确定。

于 2015-01-20T15:17:59.007 回答
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);
于 2015-02-13T05:56:09.983 回答