JAXB从同一XML解组到两个不同的对象

时间:2016-03-10 23:48:11

标签: java xml jaxb unmarshalling

在使用JAXB进行解组的过程中,我试图将file.xml解组为2个不同的java pojo,但是unmarshaller一直认为第二个对象仍然是第一个,因此它会得到一个转换类错误。

您可以在以下代码中看到我尝试取消联合

this.timbre = (TimbreFiscalDigital) jaxbUnmarshaller.unmarshal(path.toFile());
this.comprobante = (Comprobante) jaxbUnmarshaller.unmarshal(path.toFile());

总是会收到一个错误,告知有一个类强制转换异常

  

java.lang.ClassCastException:cfdi.bindings.CFDI32.Comprobante不能   被转换为cfdi.bindings.TimbreFiscal.TimbreFiscalDigital

如果我只是试图解散" Comprobante"它有效...但不适用于" TimbreFiscalDigital"

public CFDI(Path path){

     JAXBContext jaxbContext;
    try {
        jaxbContext = JAXBContext.newInstance("cfdi.bindings.CFDI32:cfdi.bindings.TimbreFiscal");
        Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();

        this.timbre = (TimbreFiscalDigital) jaxbUnmarshaller.unmarshal(path.toFile());
        this.comprobante = (Comprobante) jaxbUnmarshaller.unmarshal(path.toFile());

    } catch (JAXBException ex) {
        Logger.getLogger(CFDI.class.getName()).log(Level.SEVERE, null, ex);
    }    

}

我无法找到错误...仅供我使用netbeans 8.1 JAXB

更新来自评论的示例XML:

<Comprobante>
    <Emisor></Emisor>
    <Complemento>
        <TimbreFiscalDigital>
        </TimbreFiscalDigital>
    </Complemento>
</Comprobante>

1 个答案:

答案 0 :(得分:0)

由于您的XML包含<Comprobante>根元素,因此XML将被解组为Comprobante类的实例。 <Complemento><TimbreFiscalDigital>嵌套元素将被解组为Comprobante类的嵌套对象。

不知道您的架构,我将假设<Complemento>映射到List<TimbreFiscalDigital> complemento类的Comprobante字段。要获取TimbreFiscalDigital的实例,您必须询问Comprobante的实例以获取该列表并重复列表。

您无法再次解析XML。已经解析了完整的XML。