2011-02-23 7 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> 

Javaに反映されるようにスキーマを変更した後、xjcを使用してクラスファイルを再生成する必要があります。

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)のドキュメント、チュートリアルのためのグーグル、仕事をするまで試してみました。 – justkt