schema XML e problema quando derivante dal tipo misto
-
28-09-2019 - |
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
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.