2009-10-28 10 views
11

新規のxmlスキーマに関する質問があります。答えは、スキーマではできないことはできないと確信していますが、私は確信しています。問題は、成功したときに1つのタイプのルート要素(たとえば、<レスポンス>)で応答を返すウェブサービスがあり、完全なエラーで別のルート要素(たとえば、< Exception>)を持つドキュメントが返されるということです。だから、基本的には、2つの完全に異なる文書:スキーマをxmlにして、ドキュメントルートとして選択肢を使用する

<レスポンス> ...... < /レスポンス> OR
<例外> .... < /例外>

は、それがこれらを記述することが可能です2つの異なるドキュメントスキーマドキュメント?それは、スキーマ要素の下の最初の要素として選択肢が必要なようですが、それは有効な構文ではありません。私は有効なxsdとして解析するいくつかのバリエーションを試しましたが、ドキュメントを検証しません。助言がありますか?それとも、これは簡単にできないのですか?お返事ありがとうございます。

+0

XML-RPCリクエスト/レスポンスの形式を検討しましたか?また、応答または例外が返されます。より良いものが見つからない場合は、ここに私のメモがあります:http://www.chrisbunney.com/wiki/index.php/XML-RPC_protocol – chrisbunney

答えて

31

実際、XMLスキーマでは、choice要素を使用せずに、1つのスキーマで代替ルート要素を定義することができます。代わりに、schema要素の直接の子として、それぞれの可能な根をリストするだけです。

たとえば、以下のXMLスキーマ与えられた:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="foo"> 
     ... 
    </xs:element> 
    <xs:element name="bar"> 
     ... 
    </xs:element> 
</xs:schema> 

次の書類のいずれかが、それに対して検証します:

<foo> 
    ... 
</foo> 

または:

<bar> 
    ... 
</bar> 
+0

http://tools.decisionsoft.com/schemaValidateでこれを検証しました。/so +1 – chrisbunney

+0

さあ、これは明らかだったはずです。ありがとう! – mikey

+0

これは、いくつかのルートノードが同じ構造をたくさん共有するきちんとしたソリューションです。私が見ている唯一の欠点は、ルートノードが期待されていることを確認するための初期チェックが必要な場合があるということです。 –

-1

それは可能ではないですが、しかし、その選択肢はそれほど悪くはありません。入力として入力されたルートノードを宣言し、アプリケーションに「成功」​​または「例外」子を持つ「応答」ノードを返させます。アプリケーションを変更できない場合は、不運になりますが、そのような単純な応答では、2つの異なるスキーマを作成することはできません。最初のChildノードを読み取り、関連するスキーマを適用しますか?

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="Response"> 
    <xs:complexType> 
     <xs:choice> 
      <xs:element name="Success"/> 
      <xs:element name="Exception"/> 
     </xs:choice> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 
1

私はこの投稿に出会い、私はSpring Web Servicesの世界(データ契約を重視するもの)から得たものに言及する価値があると考えました。

このルート要素の問題をネゴシエートする良い方法の1つは、Phil Boothが言及したように、スキーマ要素の下に複数のルート要素を直接定義することです。

ただし、データに優先順位を付けるベストプラクティスとWebサービスフレームワークについては、まずまずの証明スキーマ設計が重要です。誰かがこのようなスキーマを定義した場合 -

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xs:element name="foo"> 
    ... 
</xs:element> 
<xs:element name="bar"> 
    ... 
</xs:element> 

Webサービスを生成するには、このいわゆるデータコントラクトスキーマに依存している春-WS、などのWebサービスフレームワークを< fooの場合、理解できないことがあり>または<バー>は、サービスへの要求ルート要素です。

このリンクを参照してください - Data Contract

をこのような場合には、私は便利ラッシング「CashCommonsジョン」やスティーブンによって与えられたアプローチを発見しました。

関連する問題