1

XSD を作成しようとしている興味深い XML の状況があります。私が使用している Web サービスは、ある意味で一般的であるという点で、通常とは異なる方法で応答を送信します。

例えば、

Web サービス呼び出し 1:

<rootElement>
  <result>
    <resultset>
      <row attr="some value" attr2="some value 2" />
    </resultset>
  </result>
</rootElement>

Web サービス呼び出し 2:

<rootElement>
  <result>
    <resultset>
      <row someOtherAttr="some value" someOtherAttr2="some value 2" />
    </resultset>
  </result>
</rootElement>

ご覧のとおり、2 つの Web サービス応答を区別する唯一の要素は、row 要素内の属性です。

結果要素に抽象要素を使用することで、いくつかの異なるアプローチを試しましたが、これはある程度機能しますが、マーシャリング時に使用する結果要素を JAXB が選択できるようにする方法がわかりません。

すなわち

... other xs declarations excluded for sanity ...
<xs:element ref="abstractResult" />
... snip ...

<xs:element name="abstractResult" type="ResultType" abstract="true" />

<xs:complexType name="ResultType" abstract="true" />

<xs:complexType name="SomeResultType">
  <xs:complexContent>
    <xs:extension base="ResultType">
... snip ...

このアプローチの問題は、適切な実装を検索するのではなく、マーシャリング中に JAXB が抽象的な ResultType をインスタンス化しようとすることです。

これを回避する方法はありますか?

本当にありがとう!

4

1 に答える 1

0

スキーマを、ルート要素のさまざまな実装がある独立したファイルに分離することになりました。

次に、マーシャラーが同様の要素を区別できるように、複数のスキーマをそれぞれの名前空間に関連付けました。

xml は Web サービスから名前空間なしで取得されるため、JDom を使用して名前空間を設定しています。これは、実行時にターゲット オブジェクト タイプがどのようなものになるかを知っているからです。

これが興味のある人に役立つことを願っています。

于 2012-11-06T21:55:06.643 に答える