我正在使用 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;
}
}
答案 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没有定义命名空间。
要解决此问题,请为
创建单独的名称空间