Question

Je suivant le schéma 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>

que j'utilise pour valider cette instance XML (je veux mélanger le texte dans l'élément « élément » avec des sous-éléments de l'ordre 'et « 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>

Tout ce que je ne la validation dit encore taht il y a une erreur:

Le type de contenu d'un type dérivé et celui de sa base doit aussi être mélangé, ou les deux élément soit seule. Type 'itemType' est mixte, mais son type de base n'est pas.

Mais je peux voir que les deux types - itemType et itemTypeBase sont MIXTES !!

Merci beaucoup Sten

Était-ce utile?

La solution

D'abord l'erreur que je vois si j'ouvre votre schéma dans Visual Studio 2010 est:

  

Le type dérivé et du type à base de   doivent avoir le même type de contenu.

Dans le schéma actuel, vous le type itemTypeBase est défini par rapport du <xs:simpleContent> et le type dérivé itemType avec le respect de <xs:complexContent> ce qui est interdit. Soit vous permettre à aucun sous-éléments et de l'utilisation <xs:simpleContent> ou vous utilisez des éléments enfants et l'utilisation <xs:complexContent>.

Personnellement, je ne aime pas et ne pas utiliser les types mixtes. Si je vous comprends correct, vous voulez faire quelques restrictions dans le texte du contenu. Vous voulez avoir la longueur du contenu entre 1 et 64 caractères. Mais <order>2</order>, <id>2</id> et tous les espaces, y compris les nouveaux personnages de ligne, font également partie du contenu. Si vous voulez que <item> a un contenu simple, alors vous ne pouvez pas insérer des éléments enfants à l'intérieur.

Donc, la solution serait aller pragmatique loin du modèle mixte et utiliser le document XML sous la forme

<?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>

où Content.xsd est

<?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>

Tout sera très simple et claire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top