2016-04-30 11 views
1

私は、以下のXMLのXSDを構築しようとしていると私は検証してJavaオブジェクトにアンマーシャルするためにJAXBを使用しています。'type'属性値に基づいて要素を要求する方法はありますか?

type = jobTypetype = customerである<JobParam>の最初の2つの要素が必要です。 JobParam内の他のすべてはオプションです。

は、どのように私はこのためのXSDを作成するのですか?

<job> 
    <jobName>core</jobName> 
    <jobParams> 
     <jobParam type="jobType">Scheduler</jobParam> 
     <jobParam type="customer">Alphabet</jobParam> 
     <jobParam type="mode">music</jobParam> 
     </jobParams> 
</job> 

答えて

1

XSD 1.0では、検証規則を表すことはできません。 JAXBで作成したオブジェクトに対してJavaで実行するか、アサーションまたは条件付き型の割り当てを使用できるXSD 1.1に移動する必要があります。

しかし、最善の解決策は、あなたのXMLのデザインを修正するために、次のようになります。

  • 子供の名前で親の名前を繰り返す必要はありません。要素タイプは、名前の一部ではなく、属性値であれば
  • [マイナー]、シンプルなXSD 1.0発生の制約は、あなたの検証ルールを表現するために使用することができます。ここでは[主要]

があなたのXMLに行われた上で改善されている:あなたが考えるかもしれません

<job> 
    <name>core</name> 
    <params> 
     <type>Scheduler</type> 
     <customer>Alphabet</customer> 
     <mode>music</mode> 
    </params> 
</job> 

他の二つの改良点:

  1. はにその子を促進し、paramsラッパーをドロップ子供たちはjobです。
  2. あなたが本当にXSDの設計時に知られていないパラメータをサポートしなければならない場合customParamsラッパーを追加し直します。たとえば、

<job> 
    <name>core</name> 
    <type>Scheduler</type> 
    <customer>Alphabet</customer> 
    <customParams> 
     <customParam type="mode">music</customParam> 
    </customParams> 
</job> 

これは自明XSD 1.0における基本的な発生の制約を経てcustomermodeに関するバリデーションルールに沿って表現することができます。

+0

感謝。私はxmlを変更することができればと思います。私はあなたの提案に同意します。しかし、これは現時点では不可能です。このXMLのクライアントユーザーは、それを更新するつもりはありません。今日、私はこれらの検証をJavaオブジェクトで処理します。ただし、すべてのケースをJavaコードを使用して効果的に処理できるわけではありません。たとえば、xmlにjobParam要素が重複している場合スケジューラ SAK

+0

XMLを再設計できない場合は、**(a)**はXSD 1.1、**(b)*に移動します。 * XSDの外側にその制約を強制する(Javaで、例えば)、または**(C)**制約を削除その 'jobParam [@ TYPE = 'JOBTYPE']'と 'jobParam [@ TYPE = '顧客']'存在しなければならない。 XSD 1.0では、オリジナルのXML設計では制約を表現できません。あなたのコメントに記載されている余分な制約は似ています。 (どちらもJavaで実装するのは難しいでしょう - XSDで宣言的に検証制約を集中管理するのは非理想的です) – kjhughes

関連する問題