0

私は次のXMLスキーマを持っています:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:element name="content" type="contentType"/>

    <xs:complexType name="contentType">
        <xs:complexContent>
            <xs:extension base="versionedElementType">  
                <xs:sequence>   
                    <xs:element name="item" type="itemType" minOccurs="1" maxOccurs="unbounded" />
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="itemType" mixed="true"> 
        <xs:complexContent>
            <xs:extension base="itemTypeBase">
                    <xs:sequence>   
                        <xs:element name="order" type="xs:unsignedInt"/>
                        <xs:element name="id" type="xs:string"/>
                    </xs:sequence>
            </xs:extension> 
        </xs:complexContent>
    </xs:complexType>

    <!-- Simple type convert to complex type -->
    <xs:complexType name="itemTypeBase" mixed="true">
        <xs:simpleContent>  
            <xs:extension base="itemDescriptionType">
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    <!-- Simple type -string restriction -->
    <xs:simpleType name="itemDescriptionType" >
        <xs:restriction base="xs:string">
            <xs:minLength value="1"/>
            <xs:maxLength value="64"/>
        </xs:restriction>   
    </xs:simpleType>


    <xs:complexType name="versionedElementType">
        <xs:attribute name="version" type="xs:string" use="required"/>
    </xs:complexType>

</xs:schema>

これを使用してこのXMLインスタンスを検証します(「item」要素のテキストをサブ要素「order」および「id」と混合したい):

<?xml version="1.0" encoding="UTF-8"?>
<content xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="Content.xsd"
         version ="1.0">

  <item>Description here...
  <order>2</order>
  <id>2</id>
  </item>  
</content>

私が検証を行ったものは何でも、エラーがあると言っています:

派生型のコンテンツ型とそのベースのコンテンツ型は、両方とも混合するか、両方とも要素のみである必要があります。タイプ'itemType'は混合されていますが、その基本タイプは混合されていません。

しかし、itemTypeとitemTypeBaseの両方のタイプが混在していることがわかります!!

どうもありがとうSTeN

4

1 に答える 1

3

まず、VisualStudio2010でスキーマを開いた場合に表示されるエラーは次のとおりです。

派生型とベース型は同じコンテンツ型である必要があります。

現在のスキーマでは、タイプitemTypeBaseは、<xs:simpleContent>および派生タイプに関して定義されていますが、これitemTypeに関しては<xs:complexContent>許可されていません。サブ要素を許可せずに使用する<xs:simpleContent>か、子要素を使用してを使用します<xs:complexContent>

私は個人的に好きではなく、混合タイプを使用しません。私があなたが正しいと理解した場合、あなたはコンテンツからのテキストにいくつかの制限を加えたいと思います。コンテンツの長さを1〜64文字にする必要があります。ただし<order>2</order>、、<id>2</id>および改行文字を含むすべての空白もコンテンツの一部です。単純なコンテンツが必要な場合<item>は、子要素を内部に挿入することはできません。

したがって、実用的なソリューションは混合モデルから離れて、フォームのXMLドキュメントを使用します。

<?xml version="1.0" encoding="utf-8"?>
<content xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="Content.xsd"
         version ="1.0">
    <item>
        <description>Description here...</description>
        <order>2</order>
        <id>2</id>
    </item>
</content>

ここで、Content.xsdは

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:element name="content" type="contentType"/>

    <xs:complexType name="contentType">
        <xs:sequence>   
            <xs:element name="item" type="itemType"
                        minOccurs="1" maxOccurs="unbounded" />
        </xs:sequence>
        <xs:attribute name="version" type="xs:string" use="required"/>
    </xs:complexType>

    <xs:complexType name="itemType"> 
        <xs:sequence>
            <xs:element name="description" type="itemDescriptionType"/>
            <xs:element name="order" type="xs:unsignedInt"/>
            <xs:element name="id" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>

    <xs:simpleType name="itemDescriptionType" >
        <xs:restriction base="xs:string">
            <xs:minLength value="1"/>
            <xs:maxLength value="64"/>
        </xs:restriction>   
    </xs:simpleType>

</xs:schema>

すべてが非常にシンプルで明確になります。

于 2010-10-13T21:09:03.097 に答える