XML схема и проблема при вытекании из смешанного типа
-
28-09-2019 - |
Вопрос
У меня после 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 (я хочу смешивать текст в элементе «элемента» с порядком подразделения «и« 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>
Все, что я сделал, что я сделал, все еще говорит, что TAHT есть ошибка:
Тип содержимого производного типа и ее основания должен быть только смешанным, либо как только для элемента. Тип «itemType» смешан, но его базовый тип не является.
Но я вижу, что оба типа - itemType и itemtypebase смешаны!
Спасибо много
Решение
Прежде всего ошибка, которую я вижу, если я открываю свою схему в Visual Studio 2010:
Полученный тип и на основе на основе на базе должны иметь тот же тип контента.
В вашей текущей схеме тип 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>
где содержится контент.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>
Все будет очень простым и ясным.