2017-08-20 5 views
0

1つのXSDに2つ目の要素を含む要素が含まれているXSDが2つあります。基本的に、XSD 1には、XSD 2の任意の要素を含むことができる要素「etta」があります。Jaxbとアンマーシャリングが含まれています。XSD

xjcを使用してクラスを生成し、逆シリアル化すると、Meta要素にXSD 2の要素がJAXBElements実際のクラスはXSD 2から生成されました。私は両方のクラスのセットを私のプログラムに入れました。パッケージ情報は正しいです。

これは私がXSDを定義した方法です。私は問題が自分の「任意の」要素だと思っています。

<xs:schema xmlns="NS1" elementFormDefault="qualified" 
      xmlns:ns1="NS2" 
      targetNamespace="NS1" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:import namespace="NS2" schemaLocation="./NS2.xsd" /> 

    <xs:complexType name="Meta"> 
     <xs:sequence> 
      <xs:any namespace="NS2" minOccurs="1" maxOccurs="unbounded"/> 
     </xs:sequence> 
    </xs:complexType> 
... 
</xs:schema> 

だから基本的に私が何をしたいし、それをアンマーシャリングする、JAXBをしたいと思います「ここでXSD2で定義されている1つの以上の要素を行く」を意味する要素です。

jaxbがXSD2の要素を使用してメタコンテンツをデシリアライズするために、XSDをどのように変更する必要がありますか?

--edit-

これは、メタクラスに対して生成XJCです:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "Meta", propOrder = { 
    "any" 
}) 
public class Meta 
    extends BaseObject 
{ 

    @XmlAnyElement(lax = true) 
    protected List<Object> any; 

    public List<Object> getAny() { 
     if (any == null) { 
      any = new ArrayList<Object>(); 
     } 
     return this.any; 
    } 

} 

- (質問を一致させるためにNSを変更)、元XSD2を編集 -

<xs:schema xmlns="NS2" elementFormDefault="qualified" targetNamespace="syncml:NS2" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="MetInf"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element minOccurs="0" maxOccurs="1" ref="FieldLevel" /> 
       <xs:element minOccurs="0" maxOccurs="1" ref="Format" /> 
       <xs:element minOccurs="0" maxOccurs="1" ref="Type" /> 
       <xs:element minOccurs="0" maxOccurs="1" ref="Mark" /> 
       <xs:element minOccurs="0" maxOccurs="1" ref="Size" /> 
       <xs:element minOccurs="0" maxOccurs="1" ref="Anchor" /> 
       <xs:element minOccurs="0" maxOccurs="1" ref="Version" /> 
       <xs:element minOccurs="0" maxOccurs="1" ref="NextNonce" /> 
       <xs:element minOccurs="0" maxOccurs="1" ref="MaxMsgSize" /> 
       <xs:element minOccurs="0" maxOccurs="1" ref="MaxObjSize" /> 
       <xs:element minOccurs="0" maxOccurs="unbounded" ref="EMI" /> 
       <xs:element minOccurs="0" maxOccurs="1" ref="Mem" /> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="FieldLevel"> 
     <xs:complexType /> 
    </xs:element> 
    <xs:element name="Format" type="xs:string" /> 
    <xs:element name="Type" type="xs:string" /> 
    <xs:element name="Mark" type="xs:string" /> 
    <xs:element name="Size" type="xs:string" /> 
    <xs:element name="Anchor"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element minOccurs="0" maxOccurs="1" ref="Last" /> 
       <xs:element ref="Next" /> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="Last" type="xs:string" /> 
    <xs:element name="Next" type="xs:string" /> 
    <xs:element name="Version" type="xs:string" /> 
    <xs:element name="NextNonce" type="xs:string" /> 
    <xs:element name="MaxMsgSize" type="xs:string" /> 
    <xs:element name="MaxObjSize" type="xs:string" /> 
    <xs:element name="EMI" type="xs:string" /> 
    <xs:element name="Mem"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element minOccurs="0" maxOccurs="1" ref="SharedMem" /> 
       <xs:element ref="FreeMem" /> 
       <xs:element ref="FreeID" /> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="FreeID" type="xs:string" /> 
    <xs:element name="FreeMem" type="xs:string" /> 
    <xs:element name="SharedMem"> 
     <xs:complexType /> 
    </xs:element> 
</xs:schema> 

- これは私のXSD1でメタが使われている方法です:

<xs:element name="TargetRef" type="xs:string" /> 
    <xs:element name="VerDTD" type="xs:string" /> 
    <xs:element name="VerProto" type="xs:string" /> 
    <xs:element name="Item"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element minOccurs="0" maxOccurs="1" ref="Target" /> 
     <xs:element minOccurs="0" maxOccurs="1" ref="Source" /> 
     <xs:element minOccurs="0" maxOccurs="1" ref="SourceParent" /> 
     <xs:element minOccurs="0" maxOccurs="1" ref="TargetParent" /> 
     <xs:element minOccurs="0" maxOccurs="1" ref="Meta" /> 
     <xs:element minOccurs="0" maxOccurs="1" ref="Data" /> 
     <xs:element minOccurs="0" maxOccurs="1" ref="MoreData" /> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
    <xs:element name="Meta" type="xs:string" /> 
    <xs:element name="Correlator" type="xs:string" /> 
    <xs:element name="Data" type="xs:string" /> 
+0

これらの 'JAXBElement'にはXSD 2のクラスのインスタンスが含まれていますか?彼らはすべき。あなたの問題が 'JAXBElement'ラッパーだけを避けているのであれば、XSD 2クラスに' @ XmlRootElement'があることを確認してください。 – lexicore

+0

これらは実際にはXSD2のクラスのインスタンスを含んでおらず、name = "NS2:(some elements)"およびdeclaredType = StringのプレーンJAXBElementsを含んでいます。私のクラスは@XmlRootElementを持っています(XSD1とXSD2の両方のクラスはxjcを使って生成されます)。元の質問に追加します。 –

答えて

1

どのようにsth。

2番目のxsdのすべての要素をシーケンスに挿入し、要素自体の代わりにシーケンス内にminOccursとmaxOccursを定義します。 (コードhereからである - 例2)

<xs:element name="Meta"> 
    <xs:complexType> 
     <xs:sequence minOccurs="1" maxOccurs="unbounded"> 
      <xs:element name="elements" type="ns1:typeA"/> 
      <xs:element name="from" type="ns1:typeB"/> 
      <xs:element name="NS2" type="ns1:typeC"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

第XSDを少し変更することが必要となる別の選択肢:

代わりに、このように見える線2-4:

<xs:element name="MetInf"> 
    <xs:complexType> 
     <xs:sequence> 

これらは次のようになります。

 <xs:complexType name="MetInf"> 
      <xs:sequence> 

そしてNS1.xsdは次のようになります。

<xs:schema 
    xmlns="NS1" 
    elementFormDefault="qualified" 
    targetNamespace="NS1" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:ns1="NS2"> 

<xs:import namespace="NS2" schemaLocation="NS2.xsd" /> 

<xs:complexType name="Meta"> 
    <xs:sequence> 
     <xs:element name="metaInf" type="ns1:MetInf" minOccurs="1" maxOccurs="unbounded"/> 
    </xs:sequence> 
</xs:complexType> 

以下のクラスが生成されるのと同じディレクトリにfirstSchema.xsdとNS2.xsdとXJCを実行している:

ns2/Anchor.java 
ns2/FieldLevel.java 
ns2/Mem.java 
ns2/MetInf.java 
ns2/ObjectFactory.java 
ns2/SharedMem.java 
ns2/package-info.java 
ns1/Meta.java 
ns1/ObjectFactory.java 
ns1/package-info.java 

firstSchema.xsdのMetaクラスは次のようになります:

public class Meta { 

@XmlElement(required = true) 
protected List<MetInf> metaInf; 
public List<MetInf> getMetaInf() { 
    if (metaInf == null) { 
     metaInf = new ArrayList<MetInf>(); 
    } 
    return this.metaInf; 
} 
} 

あなたは必要な場所のどこにでもありますか?

+0

NS2には多くの名前空間があるので、少し実用的ではありません。私はNS2が変更されたときにも(NSの外部のNSである)どんなタイプのものも見逃したくありません。 –

+0

あなたの問題を解決する別の解決法を追加しました。私はまだ自分自身でそのオプションを試していないので試してみてください。 – giro

+0

パーサーは、このように名前空間を参照するのが好きではないようです。それは私にとって死んでしまいます。「NS2」という名前を(n) '要素宣言'コンポーネントに解決できません。 –

関連する問題