1

カスタム XML (ファイルの生成に使用) の XSD スキームを定義しました。という名前の属性がありますtype。定義済みのリストとその他の文字列値を受け入れるようにしたいと考えています。typeは標準 (int、string など) にもカスタム (任意の名前) にもできるためです。出来ますか?

XML の例:

<submodel name="Country">
    <field name="Handler" type="Clients.CountryHandlerModel" />
    <field name="Name" type="string" />
</submodel>

type属性の XSD の説明:

<xs:attribute name="type" use="required">
    <xs:simpleType>
        <xs:restriction>
            <xs:simpleType>
                <xs:list>
                    <xs:simpleType>
                        <xs:restriction base="xs:token">
                            <xs:enumeration value="bit"/>
                            <xs:enumeration value="boolean"/>
                            <xs:enumeration value="int"/>
                            <xs:enumeration value="decimal"/>
                            <xs:enumeration value="double"/>
                            <xs:enumeration value="date"/>
                            <xs:enumeration value="datetime"/>
                            <xs:enumeration value="string"/>
                            <xs:enumeration value="binary"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:list>
            </xs:simpleType>
            <xs:minLength value="1"/>
        </xs:restriction>
    </xs:simpleType>
</xs:attribute>
4

3 に答える 3

2

検証を純粋に yes/no 関数と見なす場合、James Holderness は正しいですが、データ型付けを行いたい場合は、メンバーが (a) 許可された値のリストを含む型である共用体型を定義するスキーマ、および ( b) xs:string は、ノードに添付された型注釈が値がリストに存在するかどうかを反映するため、役立つ場合があります。ただし、なぜこれが必要なのかを明確にする必要があります。

于 2013-06-30T14:06:55.670 に答える
0

他の値も有効として受け入れる場合、特定の値のリストを用意しても意味がありません。

あなたがスキーマバリデーターで、値がこの型に正しく一致するかどうかを検証しようとしているとします。事前定義されたリストを調べて一致を探すこともできますが、値がそのリストにない場合はどうなるでしょうか? スキーマは他の文字列値も有効であると見なすため、とにかくそれを受け入れます。そのため、リストをチェックしても意味がありませんでした。

タイプを作成するxs:stringxs:token、そのままにしておきます。

現在、Michael Kay は、データ型指定にスキーマを使用している場合、より複雑なデータ型 (列挙と文字列の和集合) が依然として役立つ可能性があるという議論を行っていました。このようなスキーマは次のようになります (xs:list単純にするために要素の内容を示しているだけです)。

<xs:simpleType>
  <xs:union>
    <xs:simpleType>
      <xs:restriction base="xs:token">
        <xs:enumeration value="bit"/>
        <xs:enumeration value="boolean"/>
        <xs:enumeration value="int"/>
        <xs:enumeration value="decimal"/>
        <xs:enumeration value="double"/>
        <xs:enumeration value="date"/>
        <xs:enumeration value="datetime"/>
        <xs:enumeration value="string"/>
        <xs:enumeration value="binary"/>
      </xs:restriction>
    </xs:simpleType>
    <xs:simpleType>
      <xs:restriction base="xs:token"/>
    </xs:simpleType>
  </xs:union>
</xs:simpleType>

しかし、それがあなたにとって何の役にも立たないと思います。

オブジェクトを XML に、またはその逆にシリアル化する目的で、その xsd をクラスに変換したいとします。Visual Studio を使用していることを考えると、Microsoft の xsd utility のようなものを使用すると思います。しかし、それはこの非常に複雑な型定義を単純な文字列として扱います。またしても何のメリットもありません。

そうは言っても、他のスキーマ処理ツールや、複雑なデータ型が役立つ可能性がある他の状況が存在する可能性があることは認めます。しかし、誰かがそのような使用の実際の例を提供するまでは、文字列またはトークンの単純なリストが最も賢明な解決策であると私は信じています。

于 2013-06-30T11:59:02.303 に答える