Domanda

Ho seguente schema 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>

che io uso per convalidare questa istanza XML (voglio mescolare il testo nell'elemento 'voce' con sub-elementi 'ordine' e '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>

Qualunque cosa ha fatto la convalida dice ancora taht c'è un errore:

Il tipo di contenuto di un tipo derivato e quella della sua base deve essere sia mista o entrambi essere elemento soltanto. Tipo 'itemType' è misto, ma il suo tipo di base non è.

ma posso vedere che entrambi i tipi - itemType e itemTypeBase sono MISTO !!

Grazie mille Sten

È stato utile?

Soluzione

Prima di tutto l'errore che vedo se apro lo schema in Visual Studio 2010 è il seguente:

  

Il tipo derivato e il tipo base   devono avere lo stesso tipo di contenuto.

In te schema corrente il tipo itemTypeBase è definito rispetto della <xs:simpleContent> e derivato di tipo itemType con il rispetto di <xs:complexContent> che non è consentito. O si consente sotto-elementi e l'uso <xs:simpleContent> o fate elementi figlio d'uso e utilizzo <xs:complexContent>.

Io personalmente non mi piace e non uso tipi misti. Se ho ben capito si corregge si vuole fare alcune restrizioni nel testo dal contenuto. Volete avere la lunghezza del contenuto tra 1 e 64 caratteri. Ma <order>2</order>, <id>2</id> e tutti gli spazi, comprensivo dei nuovi personaggi di linea, sono anche una parte del contenuto. Se si desidera che <item> ha contenuto semplice, quindi non è possibile inserire elementi figlio all'interno.

Quindi la soluzione pragmatica sarebbe andare via dal modello misto e utilizzare il documento XML nel formato

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

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

Tutto sarà molto semplice e chiaro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top