4

簡単な問題だと思っていたことが、頭を悩ませていることがわかりました。

現在、JAXB 2 を使用して、制御できない XSD からコードを生成しています。これらのオブジェクトに値を設定するときに、いくつかのロジックとガード コードを適用できるように、スキーマから制約にアクセスする必要があります。一括で検証するだけでは不十分です。ほとんどの場合、文字列を単純に切り捨てるだけで問題ありません。このためには、XSD で宣言された長さを取得してガード コードに適用し、このレイヤーをジェネリックに保つ必要があります。別の方法は、長さをコピーしてハードコードすることですが、率直に言って、これを行うより良い方法があれば、本当に感謝しています。

ここでは文字列の長さについて話しますが、これは XSD で宣言可能なすべてのファセットに当てはまります。

提案、コード サンプル、およびリンクを歓迎します。基本的に、クラス内のデータをハード コーディングしないのに役立つものであれば何でも構いません。

ありがとう

4

2 に答える 2

4

私は同様の問題に直面しましたが、私が見つけた最善の解決策は、独自の XJC プラグインを作成することでした。XJC プラグインは XML スキーマと生成されたクラスの両方にアクセスできるため、制限情報を取得する最も簡単な方法のように思えました。私のプラグインは、スキーマで制限が適用された、生成されたクラスの任意のフィールドに注釈を追加しました。たとえば、次のような要素

<xs:element name="text">
    <xs:simpleType>
        <xs:restriction base="xs:string">
            <xs:maxLength value="20" />
        </xs:restriction>
    </xs:simpleType>
</xs:element>

次のように表示されます

@XmlRestrictions(maxLength = 20)
protected String text;

生成されたクラスファイルに. 次に、リフレクションを使用して、フィールドから制限情報を抽出できます。

プラグインを作成するためのドキュメントはあまり優れていませんが、この記事は役に立ちました。Default Value Pluginのソース コードを見て、XML スキーマと生成されたクラス構造の XJC のメモリ内表現にドリルダウンする方法を確認してください。JAXB、XSOM 、およびCodeModel API も役立ちます

于 2010-07-21T19:32:18.087 に答える
1

XSD には、明確なルールではなく、セマンティックな「ガイドライン」が含まれているようです。私見 XSD が合意されている場合、それに準拠しないと違反になります。

これが当てはまらず、XSD に解釈の対象となるガイドラインが含まれている場合は、XSD 解析 API を理解することに時間を費やし、その方法で問題を解決しようとします。ここで車輪を再発明しても意味がありません。

ただし、私は採用されたアプローチに疑問を呈し、XSD 内の明確なルールに同意しようとします。

于 2012-08-13T11:20:13.677 に答える