0

私はこれを理解するために多くの研究を行ってきましたが、それでも成功していません。

このスキーマに従うXSDがいくつかあります。

Simple_Identification.xsd

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
       <xsd:include schemaLocation="./Base_3039.xsd"/>
       <xsd:include schemaLocation="./Simple_A.xsd"/>
       <xsd:include schemaLocation="./Simple_S.xsd"/>
       <xsd:include schemaLocation="./Simple_N.xsd"/>
       <xsd:include schemaLocation="./Simple_V1.xsd"/>
       <xsd:include schemaLocation="./Simple_L.xsd"/>
       <xsd:include schemaLocation="./Simple_V.xsd"/>
       <xsd:include schemaLocation="./Simple_C.xsd"/>
       <xsd:simpleType name="Simple_Identification">
               <xsd:restriction base="Base_3039"/>
       </xsd:simpleType>
</xsd:schema>

たとえば、Simple_S.xsdは次のようになります。

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:include schemaLocation="./Simple_Identification.xsd"/>
    <xsd:simpleType name="Simple_S">
      <xsd:restriction base="Simple_Identification">
           <xsd:minLength value="14"/>
           <xsd:maxLength value="14"/>
     </xsd:restriction>
    </xsd:simpleType>
</xsd:schema>

最終的には、次のようなタグを含むXMLファイルを生成できるようにしたいと思います。

<Identification xsi:type="Simple_S">XYZUVW</Identification>

今のところ、mapSimpleTypeDefを有効にせずに、Simple_Sのような単純な型を無視して、XMLファイルをマーシャル/アンマーシャルすることができます。

mapSimpleTypeDefを有効にすると、単純型のクラスが生成されます。Simple_Identificationは、Base_3039フィールドを含むクラスにマップされます。また、Base_3039クラスにはStringフィールドが含まれています。ただし、Simple_Identificationsのさまざまなサブタイプのクラスは、Simple_Identificationを拡張せず、Simple_Identificationタイプのフィールドのみを含みます。これは、マーシャリング/アンマーシャリングの場合には役立ちません。

たとえば、このXMLファイルをアンマーシャリングする場合:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Header xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="...">
  <Identification>EDS-200708021031-950012222329</Identification>
  <Time>2007-08-02T10:31:44.449+01:00</Time>
  <Function>9</Function>
  <Sender>
    <Identity xsi:type="Simple_S">111111380002111</Identity>
 </Sender>
</Header>

Identityの値は、特殊なSimple_Sオブジェクトではなく、Simple_Identificationオブジェクトにマッシュオール解除されます。さらに、マーシャルバックすると、生成されたXMLですべてのxsi:type属性が失われます。

したがって、基本的に、私の質問は、xsi:typesを含むXMLを適切にアンマーシャリングして生成するにはどうすればよいかということです。私が使用しているスキーマは、これを行うのに適切ではありませんか?xsd:restrictionはJAXBによる継承のタイプとして解釈されませんか?

XSDは自分で変更するものではないことに注意してください。私は、XSDを使用して、XMLを適切に読み取って生成する必要があります。

私がこれを理解するのを手伝ってくれてありがとう!

-アンカ

4

1 に答える 1

0

JAXBはをサポートしxsi:typeますが、単純な型ではなく、複雑な型を処理する場合に生成される(および作成されるインスタンスオブジェクト)さまざまなサブクラスのみが表示されます。

ファセットのみを使用して単純型を制限しても、JAXBを使用して新しいクラスを作成することにはなりません。これは、純粋にオブジェクト指向の用語では、派生クラスはとにかくスーパークラスとまったく同じに見えるためです。

于 2011-05-19T14:12:24.350 に答える