Frage

Ich habe folgende XML-Schema:

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

, die ich diese XML-Instanz zu validieren (Ich möchte in dem ‚item‘ Elemente den Text mischen mit Unterelementen ‚Ordnung‘ und ‚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>

Wie auch immer ich habe die Validierung sagt noch taht ein Fehler ist:

Der Inhaltstyp von einem abgeleiteten Typ und seiner Basis muß gemischt werden beide oder beides sein Element geschützt. Typ 'itemType' ist gemischt, aber sein Basistyp ist es nicht.

Aber ich kann sehen, dass beide Arten - itemType und itemTypeBase sind MIXED !!

Vielen Dank Sten

War es hilfreich?

Lösung

Zunächst werden die Fehler, die ich sehen, ob ich Ihr Schema in Visual Studio 2010 öffnen, ist:

  

Der abgeleitete Typ und der Basis-Typ   haben müssen denselben Inhaltstyp.

Sie aktuelle Schema der Typ itemTypeBase bezüglich des <xs:simpleContent> definiert und Typ itemType mit dem Respekt von <xs:complexContent> abgeleitet, die nicht erlaubt ist. Entweder lassen Sie keine Unterelemente und Verwendung <xs:simpleContent> oder Sie verwenden Kind-Elemente und die Verwendung <xs:complexContent> tun.

Ich persönlich nicht gefällt und nicht Mischtypen verwenden. Wenn ich verstehe, korrigieren Sie einige Einschränkungen im Text vom Inhalt machen wollen. Sie möchten den Inhalt Länge zwischen 1 und 64 Zeichen haben. Aber <order>2</order>, <id>2</id> und alle Leerzeichen, inklusive das neue Linie Zeichen, sind auch ein Teil des Inhalts. Wenn Sie, dass <item> wollen einen einfachen Inhalt, dann können Sie nicht Einsatz Kind-Elemente im Inneren.

So ist die pragmatische Lösung aus dem Mischmodell geht weg und das XML-Dokument in Form verwenden würde,

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

Dabei gilt Content.xsd ist

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

Alle werden sehr einfach und klar.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top