y el esquema XML problema cuando se deriva de tipo mixto
-
28-09-2019 - |
Pregunta
He siguiente esquema 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 utilizo para validar esta instancia XML (I quiere mezclar el texto en el elemento 'item' con sub-elementos 'orden' y '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>
Todo lo que hizo la validación todavía dice taht hay un error:
El tipo de contenido de un tipo derivado y la de su base debe ser a la vez mezclado o ambos sea de sólo elemento. Tipo 'tipoElemento' es mixta, pero su tipo base no lo es.
Pero puedo ver que ambos tipos - tipoElemento y itemTypeBase se mezclan !!
Muchas gracias Sten
Solución
Ante todo, el error que veo si abro el esquema en Visual Studio 2010 es la siguiente:
El tipo derivado y el tipo basado deben tener el mismo tipo de contenido.
En usted esquema actual la itemTypeBase
tipo se define con respecto a la <xs:simpleContent>
y deriva tipo itemType
con el respeto de <xs:complexContent>
que no está permitido. O bien se permite ningún sub-elementos y el uso <xs:simpleContent>
o usted hace uso de elementos secundarios y el uso <xs:complexContent>
.
Yo personalmente no me gusta y no uso tipos mixtos. Si entiendo a corregir desea hacer algunas restricciones en el texto del contenido. ¿Quieres tener la longitud del contenido entre 1 y 64 caracteres. Pero <order>2</order>
, <id>2</id>
y todos los espacios en blanco, ambos inclusive los caracteres de nueva línea, son también una parte del contenido. Si quieres que <item>
tiene contenido simple, entonces no se puede insertar elementos secundarios en el interior.
Así que la solución pragmática sería ir lejos del modelo mixto y utilizar el documento XML en forma
<?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>
donde Content.xsd es
<?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>
Todo será muy sencillo y claro.