JAXB - 解组时意外的元素uri

时间:2014-02-20 16:27:14

标签: java xml jaxb

我正在使用 JAXB 来解析来自SOAP请求的XML响应,并且我收到以下错误:

unexpected element (uri:"http://www.portalfiscal.inf.br/nfe", local:"NFe"). Expected elements are <{}protNFe>,<{}NFe>

这是收到的XML的相关部分:

[...]

<XmlNFCe>
    <nfeProc xmlns="http://www.portalfiscal.inf.br/nfe" versao="3.10">
        <NFe>
            <infNFe versao="3.10" Id="NFe43140215402636000137651040000000161893466508">
                <ide>...
       </NFe>
       <protNFe>...

[...]

此类代表 root 标记。它是我用来解组的目标类:

    @XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name="XmlNFCe", 
    propOrder={
        "nfeProc"
    })
@XmlRootElement(name="XmlNFCe", namespace="")
public class XmlNfce {

    @XmlElement(name="nfeProc", namespace="http://www.portalfiscal.inf.br/nfe")
    private NFeProc nfeProc;

    public NFeProc getNfeProc() {
        return nfeProc;
    }

    public void setNfeProc(NFeProc nfeProc) {
        this.nfeProc = nfeProc;
    }
}

这三个类是儿童标签:

第一课:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name="nfeProc", 
    propOrder={
        "NFe",
        "protNFe"
    })
@XmlRootElement(name="nfeProc", namespace="http://www.portalfiscal.inf.br/nfe")
public class NFeProc {

    @XmlElement(name="NFe", namespace="", type=NFe.class)
    private NFe NFe;

    @XmlElement(name="protNFe", namespace="", type=ProtNFe.class)
    private ProtNFe protNFe;

    public NFe getNFe() {
        return NFe;
    }

    public void setNFe(NFe nFe) {
        NFe = nFe;
    }

    public ProtNFe getProtNFe() {
        return protNFe;
    }

    public void setProtNFe(ProtNFe protNFe) {
        this.protNFe = protNFe;
    }
}

第二类:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name="NFe", 
    propOrder={
        "infNFe",
        "Signature"
    })
@XmlRootElement(name="NFe", namespace="")
public class NFe {

    @XmlElement(name="infNfe")
    private InfNfe infNFe;

    @XmlElement(name="Signature")
    private Signature Signature;

    public InfNfe getInfNFe() {
        return infNFe;
    }

    public void setInfNFe(InfNfe infNFe) {
        this.infNFe = infNFe;
    }

    public Signature getSignature() {
        return Signature;
    }

    public void setSignature(Signature signature) {
        this.Signature = signature;
    }
}

第三课:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name="protNFe", 
    propOrder={
        "infProt"
    })
@XmlRootElement(name="protNFe", namespace="")
public class ProtNFe {

    @XmlElement(name="infProt")
    private InfProt infProt;

    public InfProt getInfProt() {
        return infProt;
    }

    public void setInfProt(InfProt infProt) {
        this.infProt = infProt;
    }
}

2 个答案:

答案 0 :(得分:1)

除非我记错了,否则XML元素会继承其父级的命名空间,如果它们不自己声明的话。

所以,在

<nfeProc xmlns="http://www.portalfiscal.inf.br/nfe" versao="3.10">
    <NFe>
        <infNFe versao="3.10" Id="NFe43140215402636000137651040000000161893466508">
            <ide>...
   </NFe>

元素<NFe><nfeProc>具有相同的名称空间,即。 http://www.portalfiscal.inf.br/nfe。但是,在Java类中,它们被映射到由空字符串""组成的命名空间。

@XmlElement(name="NFe", namespace="", type=NFe.class)
private NFe NFe;

@XmlElement(name="protNFe", namespace="", type=ProtNFe.class)
private ProtNFe protNFe;

因此,unmarshaller找到一个名为<NFe>的元素http://www.portalfiscal.inf.br/nfe,但这不是它所期望的,因为错误说

unexpected element (uri:"http://www.portalfiscal.inf.br/nfe", local:"NFe"). Expected elements are <{}protNFe>,<{}NFe>

只需在适当的位置修复命名空间声明。

答案 1 :(得分:0)

看起来你从中生成jaxb类的XML是不对的。

在你的XML中,nfeProc是你定义了命名空间的根元素,子元素NFE和protNFe没有定义命名空间。

要解决此问题,请为

创建单独的名称空间