gpt4 book ai didi

java - JAXB - 解码时意外的元素 uri

转载 作者:行者123 更新时间:2023-11-30 11:22:06 25 4
gpt4 key购买 nike

我正在使用 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>...

[...]

此类代表 标签。这是我用来解码的目标类:

    @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;
}
}

最佳答案

除非我没记错,如果 XML 元素没有自己声明,它们将继承其父元素的命名空间。

所以,在

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

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

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

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

所以解码器找到一个元素 <NFe>命名空间为 http://www.portalfiscal.inf.br/nfe , 但这不是它所期望的,正如错误所说

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

只需在适当的地方修复您的 namespace 声明即可。

关于java - JAXB - 解码时意外的元素 uri,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21913778/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com