30 Stimmen

Xsd und Vererbung

Ich habe ein xsd wie dieses

<xsd:complexType name="A">  
        <xsd:complexContent>  
            <xsd:sequence>  
                <xsd:element name="options">  
                    <xsd:complexType>  
                        <xsd:sequence>  
                            <xsd:element name="Day">  
                            ...  
                            </xsd:element>  
                        </xsd:sequence>  
                    </xsd:complexType>  
                </xsd:element>  
            </xsd:sequence>  
        </xsd:complexContent>  
</xsd:complexType>  

<xsd:complexType name="B">  
    <xsd:complexContent>
        <xsd:extension base="A">
        ...What would go here...
        </xsd:extension>
    </xsd:complexContent>
</xsd:complexType>  

Also im Grunde möchte ich Klasse A eine Reihe von Optionen (Tag, Woche zum Beispiel) haben, dann möchte ich B von A erben und haben alle Optionen von A und eine zusätzliche 2 oder 3 Optionen wie Stunden, Sekunden.

38voto

Richard Nienaber Punkte 9606

Hier ist das Schema, das ich mir ausgedacht habe:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="inheritance"
    targetNamespace="http://test.com"
    elementFormDefault="qualified"
    xmlns="http://www.w3.org/2001/XMLSchema"
    xmlns:test="http://test.com"
>
    <xs:element name="Time">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="First" type="test:A" />
                <xs:element name="Second" type="test:B" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:complexType name="shortOptions">
        <xs:sequence>
            <xs:element name="Day" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="longOptions">
        <xs:complexContent>
            <xs:extension base="test:shortOptions">
                <xs:sequence>
                    <xs:element name="Week" />
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="A">
        <xs:sequence>
            <xs:element name="options" type="test:shortOptions" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="B">
        <xs:sequence>
            <xs:element name="options" type="test:longOptions" />
        </xs:sequence>
    </xs:complexType>

</xs:schema>

Das scheint zu diesem xml zu passen:

<?xml version="1.0" encoding="utf-8" ?>
<Time xmlns="http://test.com">
    <First>
        <options>
            <Day>Today</Day>
        </options>
    </First>
    <Second>
        <options>
            <Day>Tomorrow</Day>
            <Week>This Week</Week>
        </options>
    </Second>
</Time>

11voto

csgero Punkte 2753

Fügen Sie einfach eine <xsd:sequence> mit den erforderlichen Elementen:

<xsd:complexType name="B">  
    <xsd:complexContent>
        <xsd:extension base="A">
           <xsd:sequence>
              <xsd:element name="Hours">
              ...
              </xsd:element>
           </xsd:sequence>
        </xsd:extension>
    </xsd:complexContent>
</xsd:complexType>

1voto

nedruod Punkte 1094

Sie müssen options als eigenen komplexen Typ definieren und dann extension verwenden, um einen neuen komplexen Typ options zu erstellen und Substitution statt extension zu verwenden.

0voto

tunaranch Punkte 1555

Sie müssen einen Typ für Optionen erstellen, der Stunden usw. enthält, und dann in der Antwort von csgero Optionen anstelle von Stunden hinzufügen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X