2011-02-23 2 views
0

Я сгенерировал классы с помощью xjc, и я пытаюсь обработать следующий XML-документ. Я получаю сообщение об ошибке:JAXB minOccurs и UnmarshalException

javax.xml.bind.UnmarshalException: Unexpected end of element {http://schemas.xmlsoap.org/soap/envelope/}:Body 

Я считаю, это потому, что XML не содержит элемент Fault (при добавлении в элемент неисправности, это делает процесс без ошибок Ответ будет либо содержать RETRIEVAL_ID. или Ошибка, но никогда и то и другое. Я думал, что minOccurs = 0 в схеме исправит это, но не пойдет (по крайней мере, как я это сделал). Возможно ли использовать JAXB для этой ситуации, то есть когда либо из этих элементов могут существовать, но никогда оба одновременно?

XML Ответ на вопрос:

<?xml version = '1.0' encoding = 'UTF-8'?> 
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema"> 
<env:Header> 
    <bmw:rule xmlns:bmw="http://adr.com/bmw"> 
    <bmw:customer>44</bmw:customer> 
    <bmw:schemaName>ABC</bmw:schemaName> 
    <bmw:schemaVersion>1.0</bmw:schemaVersion> 
    </bmw:rule> 
</env:Header> 
<env:Body> 
    <bmw:RETRIEVAL_ID xmlns:bmw="http://adr.com/bbs">15086</bmw:RETRIEVAL_ID> 
</env:Body> 
</env:Envelope> 

Схема:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://schemas.xmlsoap.org/soap/envelope/" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:bmw="http://adr.com/bmw"> 
<xs:import namespace="http://adr.com/bmw" schemaLocation="bmw.xsd"/> 
<xs:element name="Envelope"> 
<xs:complexType> 
    <xs:sequence> 
    <xs:element ref="env:Header"/> 
    <xs:element ref="env:Body"/> 
    </xs:sequence> 
</xs:complexType> 
</xs:element> 
<xs:element name="Header"> 
<xs:complexType> 
    <xs:sequence> 
    <xs:element ref="bmw:rule"/> 
    </xs:sequence> 
</xs:complexType> 
</xs:element> 
<xs:element name="Body"> 
<xs:complexType> 
    <xs:sequence> 
    <xs:element ref="bmw:RETRIEVAL_ID" minOccurs="0"/> 
    <xs:element ref="env:Fault" minOccurs="0"/> 
    </xs:sequence> 
</xs:complexType> 
</xs:element> 
<xs:element name="Fault"> 
<xs:complexType> 
    <xs:sequence> 
    <xs:element ref="bmw:fault"/> 
    </xs:sequence> 
</xs:complexType> 
</xs:element> 
</xs:schema> 

ответ

0

Сейчас ваш ComplexType содержит:

<xs:complexType> 
    <xs:sequence> 
    <xs:element ref="bmw:RETRIEVAL_ID" minOccurs="0"/> 
    <xs:element ref="env:Fault" minOccurs="0"/> 
    </xs:sequence> 
</xs:complexType> 

Если только один появляется в данный момент времени, вы хотите xs:choice вместо xs:sequence. См. this для получения дополнительной информации.

<xs:complexType> 
    <xs:choice> 
    <xs:element ref="bmw:RETRIEVAL_ID" minOccurs="0"/> 
    <xs:element ref="env:Fault" minOccurs="0"/> 
    </xs:choice> 
</xs:complexType> 

Вам нужно будет восстанавливать ваши файлы классов с помощью XJC после изменения схемы для изменения должны быть отражены в Java.

This article from Oracle имеет небольшой раздел о том, как JAXB обрабатывает choice. This blog post имеет довольно обширный пример choice и JAXB. Важно отметить, что у вас будет:

@XmlElements(value = { 
      @XmlElement(name="RETRIEVAL_ID", 
         type=RetrievalID.class), 
      @XmlElement(name="FAULT", 
         type=Fault.class) 
    }) 
Object possibleValue; 

в вашей Java.

+0

Это сработало, спасибо SOOOO много !!!!!!!!! – bmw0128

+1

Мне любопытно, я изучаю xml, xsd, jaxb и т. Д., Как вы узнали этот ответ, как бы я узнал этот ответ без этого форума? – bmw0128

+2

@ bmw0128 - когда я учился, это была комбинация сотрудников, просто пыталась разобраться, документация Oracle (тогда Sun), Googling для учебных пособий и просто пыталась до тех пор, пока они не работали. – justkt

Смежные вопросы