Unmarshal Jaxb类错误

时间:2014-12-29 10:20:00

标签: jaxb xsd schema jax-ws xsd-validation

我有一个xml字符串,它是来自第三方服务器的响应。

   <?xml version="1.0" encoding="utf-8"?>
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
     <SOAP-ENV:Body>
       <GetRateQuoteResponse>  
          <GetRateQuoteResult>       
          </GetRateQuoteResult>   
       </GetRateQuoteResponse> 
    </SOAP-ENV:Body></SOAP-ENV:Envelope>

我想在JAX-WS中解析它。   所以我使用this web site

将此String转换为xsd文件

网站给了我xsd如下。

<?xml version="1.0" encoding="utf-16"?>
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="SOAP-ENV:Envelope">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="SOAP-ENV:Body">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element name="GetRateQuoteResponse">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:element name="GetRateQuoteResult" type="xsd:string" />
                  </xsd:sequence>
                </xsd:complexType>
              </xsd:element>
            </xsd:sequence>
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

我现在从这个xsd生成JaxB类,它尝试创建名为的类 SOAP-ENV:Envelope SOAP-ENV:Body ,这是一个类的无效名称,但无法执行此操作。

即使我将xsd修改为信封正文,解组也会失败。

javax.xml.bind.UnmarshalException: unexpected element (uri:"http://schemas.xmlsoap.org/soap/envelope/", local:"Envelope"). Expected elements are <{}SOAP-ENV:Envelope>

请指导。

1 个答案:

答案 0 :(得分:0)

XSD不应包含任何SOAP元素;只有WSDL才有。根据定义,XSD仅为数据。传输协议信息(SOAP)不应该在数据定义中,因为XSD具有SOAP之外的应用程序。

从传递给XSD generato的条目中省略SOAP模式元素。通过在那里包含那些东西,你向生成器指示那些元素将是你的JAXB生成的类的一部分(不应该是这种情况)。您应该为生成器提供的内容是下面的摘录,它将正确生成包含GetRateQuoteResponse的模式

     <GetRateQuoteResponse>  
         <GetRateQuoteResult>       
         </GetRateQuoteResult>   
     </GetRateQuoteResponse> 

结果:

     <?xml version="1.0" encoding="utf-16"?>
         <xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <xsd:element name="GetRateQuoteResponse">
                 <xsd:complexType>
                      <xsd:sequence>
                         <xsd:element name="GetRateQuoteResult" type="xsd:string" />
                      </xsd:sequence>
                 </xsd:complexType>
            </xsd:element>
         </xsd:schema>