Home
Über mich
Veröffentlichungen

XML XML-Schema XPath XSL-T XSL-FO XQuery XProc SVG

XML-Schema / xs:complexType

xs:complexType

xs:complexType

xs:complexType name erlaubt, mehrere Attribute und/oder Childnodes an globaler Stelle zu deklarieren, wodurch die "type"-Deklaration von xs:element auf diesen definierten xs:complexType verweisen kann.

Siehe auch:

pic/xsd_complexType.svg

xs:complexType kann in XML-Schema 1.0 unterschiedliche Strukturen aufweisen:

Beispiele

In diesem XML-Schema werden Typen, die im vorhergehenden Beispiel lokal definiert wurden, global deklariert. Beginnend mit simplen Datentypen wie stringmax, wo der Basistyp xs:string über Patterns und minLength bzw. maxLength auf eine Stringlänge von mindestens zwei und maximal 20 Stellen begrenzt wird, wobei das erste Zeichen aus der Zeichenmenge großer Zahlen A bis Z und alle weiteren Zeichen aus der Zeichenmenge a bis z stammen müssen.

Ergänzend werden Complex-Types deklariert, die intern Elementsequenzen, Attribute, Choices oder anderen Anordnungen bilden. Bei der Typdefinition der einzelnen Elemente bzw. Attribute werden die anderen xs:simple- oder complexTypes herangezogen. Im Idealfall wird nur das Root-Element global definiert; die restlichen Abhängigkeiten ergeben sich aus dem gegenseitigen Aufbau der Complex- und Simple-Types.


<?xml version="1.0" encoding="UTF-8"?>
<xs:schema 
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  elementFormDefault="qualified" 
  attributeFormDefault="unqualified">
  <xs:simpleType name="stringmax20">
    <xs:restriction base="xs:string">
      <xs:maxLength value="20"/>
      <xs:pattern value="[A-Z][a-z]{1,19}"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:complexType name="CTPerson">
    <xs:sequence>
      <xs:element name="Name" type="stringmax20"/>
      <xs:element name="Vorname" 
                  type="stringmax20" 
                  maxOccurs="unbounded"/>
      <xs:element name="Alter" 
                  type="xs:nonNegativeInteger" 
                  minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
  <xs:element name="Persons">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Person" 
                  type="CTPerson" 
                  maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

pic/XSD_CT.png

Vorteil Im Idealfall existiert hier nur ein einziges xs:element als Root-Element. Die gesamte Baumstruktur wird in complexTypes definiert. Bei wiederholtem Auftreten derselben Elemente in verschiedenen Verzweigungen (z.B. rekursiver Elementdeklaration) können Mehrfachdeklarationen vermieden werden.
Nachteil Für XML-Elemente tieferer Ordnung ist die Beziehung zu seinen parent-, ancestor-, child-, descendant- Nodes ohne speziellen Editor eventuell schwer erkennbar.

Ohne targetNamespace sieht das XML-Beispieldokument so aus:


<Persons>
    <Person Age="50">
        <Name>Aa</Name>
        <Vorname>Aa</Vorname>
    </Person>    
</Persons>

Kommt allerdings ein targetNamespace hinzu, dann ändert sich das XML-Schema.


<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:wg="https://www.wilfried-grupe.de"
    targetNamespace="https://www.wilfried-grupe.de"
    elementFormDefault="qualified" 
    attributeFormDefault="unqualified">
    <xs:simpleType name="stringmax20">
        <xs:restriction base="xs:string">
            <xs:maxLength value="20"/>
            <xs:pattern value="[A-Z][a-z]{1,19}"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:complexType name="CTPerson">
        <xs:sequence>
            <xs:element name="Name" type="wg:stringmax20"/>
            <xs:element name="Vorname" 
                type="wg:stringmax20" 
                maxOccurs="unbounded"/>            
        </xs:sequence>
        <xs:attribute name="Age" 
            type="xs:nonNegativeInteger" use="required"/>
    </xs:complexType>
    <xs:element name="Persons">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Person" 
                    type="wg:CTPerson" 
                    maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

Im Fall (elementFormDefault="qualified", attributeFormDefault="qualified") finden Sie beispielsweise diesen Aufbau:


<wg:Persons xmlns:wg="https://www.wilfried-grupe.de">
    <wg:Person wg:Age="50">
        <wg:Name>Aa</wg:Name>        
        <wg:Vorname>Aa</wg:Vorname>
    </wg:Person>
</wg:Persons>

Im Fall (elementFormDefault="unqualified", attributeFormDefault="unqualified") finden Sie dagegen vielleicht diesen Aufbau:


<wg:Persons xmlns:wg="https://www.wilfried-grupe.de">
    <Person Age="50">
        <Name>Aa</Name>
        <Vorname>Aa</Vorname>
    </Person>
</wg:Persons>

wg / 21. November 2020



Fragen? Anmerkungen? Tipps?

Bitte nehmen Sie Kontakt zu mir auf.






Vielen Dank für Ihr Interesse an meiner Arbeit.



V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de

www.wilfried-grupe.de/XSD3_2.html