XML схема и проблем при извличане от смесен тип

Имам следната 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 екземпляр (искам да смеся текста в елемента „item“ с поделементи „order“ и „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>

Каквото и да направих, проверката все още казва, че има грешка:

Типът на съдържанието на производния тип и този на неговата база трябва да бъдат смесени или и двата да са само елементи. Типът 'itemType' е смесен, но основният му тип не е.

Но виждам, че и двата типа - itemType и itemTypeBase са СМЕСЕНИ!!

Благодаря много STeN


person STeN    schedule 08.10.2010    source източник


Отговори (1)


Първо, грешката, която виждам, ако отворя вашата схема в 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>

където е 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>

Всичко ще бъде много просто и ясно.

person Oleg    schedule 13.10.2010
comment
Здравейте, първо исках да смеся текста с елементи, но тъй като не успях да намеря правилната XML схема за него, използвах подобно решение, което показахте там. Трябва да се съглася 100% с вас, че е много по-просто и ясно. Благодаря ви за отделеното време и хубавия отговор. BR STeN - person STeN; 14.10.2010