SOAP 解组错误:意外元素

Posted

技术标签:

【中文标题】SOAP 解组错误:意外元素【英文标题】:SOAP Unmarshalling Error: unexpected element 【发布时间】:2021-10-02 10:28:44 【问题描述】:

我很难理解这个错误,也很难在网上找到答案。我正在尝试从“correios”使用 Postman 中的 API,但出现此错误:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
        <soap:Fault>
            <faultcode>soap:Client</faultcode>
            <faultstring>Unmarshalling Error: elemento inesperado (uri:"http://service.objetopostado.cws.correios.com.br/", local:"codigoObjeto"). Os elementos esperados são &lt;codigoObjeto> </faultstring>
        </soap:Fault>
    </soap:Body>
</soap:Envelope>

翻译:

Unmarshalling Error: unexpected element (uri:"http://service.objetopostado.cws.correios.com.br/", local:"codigoObjeto"). The expected elements are &lt;codigoObjeto>

这是 POST 请求的正文:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <consultarObjetoPostado xmlns="http://service.objetopostado.cws.correios.com.br/">
        <codigoObjeto>AB123456789BR</codigoObjeto>
    </consultarObjetoPostado>
  </soap:Body>
</soap:Envelope>

我不明白这个错误是否仅仅是&lt;codigoObjeto&gt;写错了,需要写成&lt;codigoObjeto&gt;或别的什么,因为如果我写成&lt;codigoObjeto&gt;它会显示另一个错误,像这样:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
        <soap:Fault>
            <faultcode>soap:Client</faultcode>
            <faultstring>Unmarshalling Error: Unexpected character '' (code 123) in content after '&lt;' (malformed start element?).
 at [row,col unknown-source]: [5,10] </faultstring>
        </soap:Fault>
    </soap:Body>
</soap:Envelope>

所以我真的不知道如何解决这个问题。

【问题讨论】:

【参考方案1】:

问题似乎出在命名空间中:

<consultarObjetoPostado xmlns="http://service.objetopostado.cws.correios.com.br/">
    <!-- Element codigoObjeto belongs to the default namespace "http://service.objetopostado.cws.correios.com.br/" -->
    <codigoObjeto>AB123456789BR</codigoObjeto>
</consultarObjetoPostado>

要从 XML 级别的默认命名空间中删除 codigoObjeto,需要提供命名空间前缀:

<ns:consultarObjetoPostado xmlns:ns="http://service.objetopostado.cws.correios.com.br/">
    <codigoObjeto>AB123456789BR</codigoObjeto>
</ns:consultarObjetoPostado>

或者在元素级别提供一个空的命名空间:

<consultarObjetoPostado xmlns="http://service.objetopostado.cws.correios.com.br/">
    <codigoObjeto xmlns="">AB123456789BR</codigoObjeto>
</consultarObjetoPostado>

客户端实现可能会有所不同,具体取决于用于构建和发送请求的语言和框架。

【讨论】:

感谢您的帮助。我已经尝试了您提出的两种解决方案,第二个有效,它没有显示任何错误。现在发生的奇怪事情是 什么都不返回。也许还有什么问题? 这很难说。你能分享一下叫什么的端点吗?或者如果这不可能来自服务器的响应?

以上是关于SOAP 解组错误:意外元素的主要内容,如果未能解决你的问题,请参考以下文章

javax.xml.ws.soap.SOAPFaultException:解组错误:从AXIS迁移到CXF后出现意外元素(uri:“”,local:“fault”)

如何将 SOAP XML 解组为 Java 对象 [重复]

使用 Google Adwords API 时出现解组错误

Jaxb UnMarshal 错误:意外元素(uri:“”,本地:“processedSalesOrderTypeList”)。预期的元素是

javax.xml.bind.UnmarshalException:意外元素。预期元素是(无)

在 SOAP 请求 .NET CORE 2.2 上发送的 Http.WinHttpException。收到的消息是意外的或格式错误