1

XMLデータをJavaオブジェクトにマップするためにJIBXを使用しています。これは、XMLにターゲット名前空間が1つだけ含まれている場合に完全に機能します。残念ながら、要件が変更され、2つの異なる名前空間を含むXMLデータを取得できるようになりました。

例:

<a:foo> 
  <b:bar>Simple Example</b:bar>
</a:foo>

私の質問は、2つの異なるターゲット名前空間を生成するxsdをどのように作成するかです。

 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
            targetNamespace="namespace_of_a"
            xmlns:a="namespace_of_a"
            xmlns:b="namespace_of_b"
            elementFormDefault="qualified">

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

             <!-- this won't work, because b is part of a different namespace -->
             <xs:attribute type="xs:string" use="required" name="bar"/>

          </xs:sequence>
        </xs:complexType>
      </xs:element>

 </xs:schema>

私はすでに試しました:

 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
            targetNamespace="namespace_of_a"
            xmlns:a="namespace_of_a"
            xmlns:b="namespace_of_b"
            elementFormDefault="qualified">

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

             <!-- this won't work, because jibx is reporting that targetNamespace is an unknown attribute -->
             <xs:attribute targetNamespace="namespace_of_b" type="xs:string" use="required" name="bar"/>

          </xs:sequence>
        </xs:complexType>
      </xs:element>

 </xs:schema>

助けてください。これが一般的に可能かどうかわかりませんか?前もって感謝します!

4

1 に答える 1

1

はい、可能です。これは、XSDが処理するように設計されたコアシナリオの1つです。

(1)関係する名前空間ごとに個別のスキーマドキュメントを記述し、その名前空間をtargetNamespace要素のとして指定しxs:schemaます。

a:foo要素が子として要素のみを受け入れることができる場合b:barは、スキーマドキュメントでa名前空間をインポートbして、のコンテンツモデルa:fooが要素を参照できるようにしますb:bar。たとえば、サンプルスキーマドキュメントを変更して、次のものを含めます。

<xs:import namespace="namespace_of_b"/>

(注:ここにヒントを追加する人もschemaLocationいますが、私は追加しません。)

次に、の宣言を次のように変更a:fooします。

<xs:element name="foo">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="b:bar"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

a:foo何でも受け入れることができる場合はxs:any、コンテンツモデルでワイルドカードを使用します。名前空間をインポートする必要はありませんb(その中の何も参照していないため)。

名前空間のスキーマドキュメントでは、通常の方法でb要素barを定義します(または属性bar-例を提示する方法について考えを変えたに違いないと思います)。

(2)ステップ1で準備した2つの名前空間固有のスキーマドキュメントをインポートする単純なトップレベルの「ドライバー」スキーマドキュメントをxs:import記述します。スキーマの場所情報を提供するのは、ここのステートメントです。

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
  <xs:import namespace="namespace_of_a" schemaLocation="a.xsd"/>
  <xs:import namespace="namespace_of_b" schemaLocation="b.xsd"/>
</xs:schema>

スキーマドキュメントの物理的な場所に関する情報を単一のドライバファイルに分離すると、さらに別のスキーマドキュメントが必要になるため、短期的には問題が少し複雑になります。しかし、後で少しだけ変更したいときに発生する多くの厄介な問題を回避できます。

于 2012-08-20T14:46:13.810 に答える