Unmarshal ошибка класса Jaxb

У меня есть строка 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. Поэтому я преобразовал эту строку в файл 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>

Теперь я генерирую классы JaxB из этого xsd, он пытается создать класс с именем SOAP-ENV:Envelope и SOAP-ENV:Body, который является недопустимым именем для класса, и это не удается сделать это.

Также, даже если я изменю xsd на Envelope и Body, Unmarshalling не удастся.

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

Пожалуйста, направляйте.


person Shashank Degloorkar    schedule 29.12.2014    source источник
comment
Добавьте определение пространства имен xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" в элемент схемы XML xsd:schema. Обычно конверт обрабатывается программным обеспечением веб-службы.   -  person laune    schedule 29.12.2014


Ответы (1)


XSD не должен содержать никаких элементов SOAP; это делает только WSDL. XSD по определению является или только данными. Информация о транспортном протоколе (SOAP) не должна быть в определении данных, поскольку XSD имеют приложения вне SOAP.

Пропустите элементы схемы SOAP из записи, которую вы передаете генератору XSD. Включив это туда, вы указываете генератору, что эти элементы будут частью ваших классов, сгенерированных 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>
person kolossus    schedule 29.12.2014