Gern stehe ich zur fachlichen Unterstützung in XML-Technologien, C#.NET, VisualBasic.NET und Java zur Verfügung. Sprechen Sie mich einfach an: Mail oder ☎ 0151 . 750 360 61


Warum XML-Validierung? / xs:group

xs:group

xs:group

➪ Eine weitere Design-Alternative liegt in den XML-Schema-Gruppierungen. Mit xs:group name werden Gruppen von Elementen global definiert, die sich an anderer Stelle durch xs:group ref wieder einbinden lassen.

Die globale Deklaration einer xs:group (mit @name benannt, anderweit via @ref eingebunden) erlaubt die einmalige Anordnung einer Anzahl von Elementen in Form einer xs:all, xs:sequence oder eines xs:choice (den drei zulässigen Childnodes von xs:group; insofern ist xs:group keine gleichwertige Alternative zum global definierten , der weitergehende Möglichkeiten anbietet).

Das ist sinnvoll, da xs:all, xs:sequence und xs:choice nicht global definiert werden können: Sie dürfen nicht Childnodes von xs:schema sein und auch kein Attribut @name haben, über das sie via @ref angesprochen werden können. Insofern können Sie die Globaldeklaration von xs:all, xs:sequence und xs:choice über xs:group erreichen.

Dieser Ansatz ist syntaktisch zwar korrekt, und nachdem XML-Schema alle Möglichkeiten zu technischer Perfektion bietet, steht es Ihnen frei, die gegenseitigen Abhängigkeiten auf die Spitze zu treiben. Das Ziel, Doppeldeklarationen konsequent vermeiden zu wollen, mag es rechtfertigen, XML-Schemata weitestgehend in Einzelteile zu zerlegen und deren gegenseitige Abhängigkeiten über geeignete Referenzierungen bzw. Verweise zu definieren.

Der mögliche Preis für diesen Ansatz ist ein Abstraktionsgrad, bei dem die Wartbarkeit zunehmend erschwert wird. Die konsequente Verlagerung von lokalen in globale Element-Deklarationen kann den Aufwand an Recherche, Wartung, Tests und Einarbeitung neuer Mitarbeiter beträchtlich erhöhen.

Die Problematik wird nicht einfacher, wenn die Strukturen in unterschiedliche XML-Schema-Dateien ausgelagert werden, möglichst noch mit versionsbedingten Namespaces. Die Auslagerung ermöglicht zwar die Wiederverwendbarkeit, erhöht jedoch die Gefahr der Code-Hölle.

Nochmals erschwert wird die Problematik durch eine mangelhafte oder gar nicht vorhandene Dokumentation. Je abstrakter eine Datenstruktur deklariert ist, desto notweniger sind erläuternde Zusatzinformationen. Der reine Blick auf den Quelltext ("Dokumentation? Wozu? Es steht doch alles im Code!") reicht selten aus, um die Zusammenhänge in gebotener Kürze zu erfassen.

Die Wartbarkeit ist ein zentrales Thema. Sie schreiben kein XML-Schema für die Ewigkeit: Datenstrukturen ändern sich häufig. Dabei geht es oft um Versionierung. Bei jeder Änderung der Gesetzeslage oder Verordnungen, bei jeder Neukonfiguration von Geschäftsmodellen oder bei technologischen Neuerungen wechseln die fachlichen Anforderungen der Botschaften. Daher sind (eilige) Aktualisierungen ein Dauerzustand.

Wenn Sie einmal versuchen, komplexe XML-Schemata mit hohen gegenseitigen Abhängigkeiten in ein schlüssiges Gesamtbild zu bringen, werden Sie feststellen, wie langwierig und zeitraubend diese Arbeit sein kann (auch dann, wenn Sie leistungsfähige Editoren verwenden).

Bereits die Suche nach den zulässigen -Nodes eines beliebigen XML-Elements kann aufwendig werden. Ebenso kann die Generierung von XSD-validen XML-Beispieldateien eine Herausforderung darstellen, wenn im XML-Schema mit oder rekursiven Deklarationen gearbeitet wird.


<?xml version="1.0" encoding="UTF-8"?>
<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified" 
    attributeFormDefault="unqualified">
    <xs:group name="grpPerson">
        <xs:sequence>
            <xs:element ref="Vorname" 
                maxOccurs="unbounded"/>
            <xs:element ref="name"/>
            <xs:element ref="Anrede"/>
            <xs:element ref="Alter"/>
        </xs:sequence>
    </xs:group>
    <xs:group name="grpOrt">
        <xs:sequence>
            <xs:element ref="name"/>
            <xs:element name="Person" 
                maxOccurs="unbounded">
                <xs:complexType>
                    <xs:group ref="grpPerson"/>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:group>    
    <xs:complexType name="ORT_TYP">
        <xs:group ref="grpOrt"/>
    </xs:complexType>
    <xs:complexType name="ORTE_TYP">
        <xs:sequence>
            <xs:element ref="Ort" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>    
    <xs:element name="Alter" 
        type="xs:nonNegativeInteger"/>
    <xs:element name="name"    type="ST_stringmax20"/>
    <xs:element name="Vorname" type="ST_stringmax20"/>
    <xs:element name="Anrede"  type="ST_Anrede"/>
    <xs:element name="Ort" type="ORT_TYP"/> 
    <xs:element name="Orte" type="ORTE_TYP"/>
    <xs:simpleType name="ST_stringmax20">
        <xs:restriction base="xs:NCName">
            <xs:maxLength value="20"/>
            <xs:minLength value="2"/>
            <xs:pattern value="[A-Z][a-z,ä,ö,ü]*"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="ST_Anrede">
        <xs:restriction base="xs:string">
            <xs:enumeration value="Herr"/>
            <xs:enumeration value="Frau"/>
        </xs:restriction>
    </xs:simpleType>
</xs:schema>

pic/xsd_group.png

Ein anderes Beispiel:


<xs:schema 
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  elementFormDefault="qualified">
  <xs:element name="root">
    <xs:complexType>
      <xs:choice maxOccurs="unbounded">
        <xs:group 
            ref="grp_1" 
            minOccurs="1" 
            maxOccurs="unbounded"/>
        <xs:group 
            ref="grp_2" 
            minOccurs="1" 
            maxOccurs="unbounded"/>
      </xs:choice>
    </xs:complexType>
  </xs:element>
  <xs:group name="grp_1">
    <xs:sequence>
      <xs:element name="A" type="xs:string"/>
      <xs:element name="B" type="xs:string"/>
      <xs:element name="C" type="xs:string"/>
    </xs:sequence>
  </xs:group>
  <xs:group name="grp_2">
    <xs:sequence>
      <xs:element name="X" type="xs:string"/>
      <xs:element name="Y" type="xs:string"/>
      <xs:element name="Z" type="xs:string"/>
    </xs:sequence>
  </xs:group>
</xs:schema>

pic/XSD_group.jpg

Auf diese Weise ist es möglich, etwa folgenden XML-Baum zu definieren:


<root>
    <X>X0</X>
    <Y>Y0</Y>
    <Z>Z0</Z>
    <X>X1</X>
    <Y>Y1</Y>
    <Z>Z1</Z>
    <A>a1</A>
    <B>b1</B>
    <C>c1</C>
    <X>X0</X>
    <Y>Y0</Y>
    <Z>Z0</Z>
    <A>a2</A>
    <B>b2</B>
    <C>c2</C>
    <X>X1</X>
    <Y>Y1</Y>
    <Z>Z1</Z>
</root>

Siehe auch .

wg / 22. April 2019



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_5.html