0

XMLスキーマで特定のXML属性が必要であると定義することは可能ですか?同時に、将来このリストを拡張できるようにしたいですか?

ここで、XML宣言の次の架空の部分がある場合:

<xs:element name="MyTypeInstance" type="MyType" />

<xs:complexType name="MyType">
  <xs:attribute name="FirstAttr" type="xs:int" use="required"/>
  <xs:attribute name="SecondAttr" type="xs:string" use="required"/>
</xs:complexType>

次に、次のXMLドキュメントフラグメントがこのスキーマに従って有効です。

<MyType firstAttr="123" secondAttr="abc" />

私が欲しいのは、次のXMLフラグメントを正常に検証できるようにすることです。

<MyType firstAttr="123" secondAttr="abc" ThirdAttr="some new value" />

2つの主な問題は次のとおりです。

  1. すべてのクライアントにソフトウェアの最新バージョンへの更新を強制したくないため、新しい属性を導入する必要があるたびにXMLスキーマを変更したくありません。また、一部のクライアントはアプリを更新しません。長い間;
  2. anyAttributeXMLドキュメントを操作する前に検証したいので、XMLスキーマで使用することはできません。要素だけを指定するとanyAttribute、必要な属性がいくつか欠落していることがわかりません。そして、私が理解している限り、XMLではスキーマ内attributeanyAttribute要素を使用できません(少なくとも、.netXmlDocumentクラスを使用してそのようなスキーマを機能させることはできませんでした)。

elementを使用して明示的にいくつかの属性を指定できると理想的attributeであるため、これらの属性がXMLドキュメントに存在することは正確にわかりますが、同時に、anyAttributeelementを使用してXMLドキュメントを拡張することもできます。

どのようにそれを行うことができますか?

4

2 に答える 2

3

xs:anyattribute、またはのprocessContentsいずれかの値をとることができ、デフォルトになります。strictlaxskipstrict

  • strict:対応するグローバル属性宣言が必要であり、属性はその宣言に対して検証されます
  • lax:対応するグローバル属性宣言がある場合は、属性を検証します。それ以外の場合はスキップします
  • skip:宣言があっても属性を検証しない

スキーマの次のバージョンが次のようになる場合

<xs:complexType name="MyType">
  <xs:attribute name="FirstAttr" type="xs:int" use="required" />
  <xs:attribute name="SecondAttr" type="xs:string" use="required" />
  <xs:attribute name="ThirdAttr" type="xs:string" use="required" />
  <xs:anyAttribute processContents="lax" />
</xs:complexType>

(グローバル属性を使用していない)場合skipは、追加された属性が、同じ名前で、場合によっては異なるタイプのグローバル属性宣言に対して誤って検証されないようにするのがおそらく最善です。

于 2011-06-07T02:19:07.227 に答える
1

わかりました、私は問題を解決しました。スキーマは次のようになります。

<xs:complexType name="MyType">
  <xs:attribute name="FirstAttr" type="xs:int" use="required" />
  <xs:attribute name="SecondAttr" type="xs:string" use="required" />
  <xs:anyAttribute processContents="lax" />
</xs:complexType>

processContents="lax"重要なのは、またはを指定することでしたprocessContents="skip"processContentsに設定を省略するとlaxskip検証は失敗します。誰かがこの背後にある論理を知っているなら、いくつかのコメントを入れてください。

于 2011-06-06T09:54:14.893 に答える