Announcement

Collapse
No announcement yet.

Generische Datenstrukturen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Generische Datenstrukturen

    Moin,

    ich möchte ein Schema für generische Datentypen erstellen.

    Die XML-Dateien können wie folgt aussehen:
    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <data>
      
      <list>
        <item>One</item>
        <item>Two</item>
        <item>Three</item>
      </list>
      
      <table>
        <list>
          <item>1</item>
          <item>2</item>
          <item>3</item>
        </list>
        <list>
          <item>One</item>
          <item>Two</item>
          <item>Three</item>
        </list>
        <list>
          <item>I</item>
          <item>II</item>
          <item>III</item>
        </list>
      </table>
      
      <database>
        <table>
          <list>
            <item>1</item>
            <item>2</item>
            <item>3</item>
          </list>
          <list>
            <item>One</item>
            <item>Two</item>
            <item>Three</item>
          </list>
          <list>
            <item>I</item>
            <item>II</item>
            <item>III</item>
          </list>
        </table>
        <table>
          <list>
            <item>10</item>
            <item>20</item>
            <item>30</item>
          </list>
          <list>
            <item>Ten</item>
            <item>Twenty</item>
            <item>Thirty</item>
          </list>
          <list>
            <item>X</item>
            <item>XX</item>
            <item>XXX</item>
          </list>
        </table>
      </database>
      
      <tree>
        <node>
          <node>1.1</node>
          <node>1.2</node>
        </node>
        <node>
          <node>
            <node>2.1.1</node>
            <node>2.1.2</node>
          </node>
          <node>
            <node>2.2.1</node>
          </node>
          <node>
            <node>2.3.1</node>
            <node>2.3.2</node>
            <node>2.3.3</node>
          </node>
        </node>
        <node/>
      </tree>
    
    </data>
    und meine bisherige XML Schema Definition sieht wie folgt aus
    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
      
      <!-- Data -->
      <xs:element name="data">
        <xs:complexType>
          <xs:sequence>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
              <xs:element ref="list" />
              <xs:element ref="table" />
              <xs:element ref="database" />
              <xs:element ref="tree" />
            </xs:choice>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      
      <!-- List -->
      <xs:element name="list">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="item" minOccurs="0" maxOccurs="unbounded" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    
      <!-- Table -->
      <xs:element name="table">
        <xs:complexType>
          <xs:sequence>
            <xs:element ref="list" minOccurs="0" maxOccurs="unbounded" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      
      <!-- Database -->
      <xs:element name="database">
        <xs:complexType>
          <xs:sequence>
            <xs:element ref="table" minOccurs="0" maxOccurs="unbounded" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      
      <!-- Tree -->
      <xs:element name="tree">
        <xs:complexType>
          <xs:sequence>
            <xs:element ref="node" minOccurs="0" maxOccurs="unbounded" /> 
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <!-- Tree node -->
      <xs:element name="node" type="nodeType" />
      <!-- Tree node type -->
      <xs:complexType name="nodeType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
          <xs:element name="node" type="nodeType"></xs:element>
        </xs:sequence>
      </xs:complexType>
    
    </xs:schema>
    Wie immer bin ich offen für Verbesserungsvorschläge, aber insbesondere der 'tree' macht mir Probleme, da die Validierung "Element 'node' cannot have character [children], because the type's content type is element-only." ergibt. Ich verstehe, daß ich es erlauben muß entweder einen Text oder ein node-Element zu erlauben - aber ich sehe im Moment nicht, wie das definiert werden müßte.

    Danke im voraus!

    Cheers
    Vince
    --
    Cheers Vince

  • #2
    Du kannst
    Code:
    mixed="true"
    zu einem complexType als Attribut deklarieren:
    Code:
      <xs:element name="node">
        <xs:complexType mixed="true">
          <xs:sequence>
            <xs:element minOccurs="0" maxOccurs="unbounded" ref="node"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    ingesamt etwa

    Code:
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
      <xs:element name="tree">
        <xs:complexType>
          <xs:sequence>
            <xs:element maxOccurs="unbounded" ref="node"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="node">
        <xs:complexType mixed="true">
          <xs:sequence>
            <xs:element minOccurs="0" maxOccurs="unbounded" ref="node"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:schema>
    damit ist das Beispiel
    Code:
    <tree>
    	<node>
    		<node>1.1</node>
    		<node>1.2</node>
    	</node>
    	<node>
    		<node>
    			<node>2.1.1</node>
    			<node>2.1.2</node>
    		</node>
    		<node>
    			<node>2.2.1</node>
    		</node>
    		<node>
    			<node>2.3.1</node>
    			<node>2.3.2</node>
    			<node>2.3.3</node>
    		</node>
    	</node>
    	<node/>
    </tree>
    dann gültig.

    Allerdings auch ein Mix aus Text und Elementknoten wie unten:

    Code:
    <tree>
    	<node>
    		<node>1.1</node>
    		<node>1.2</node>
    	</node>
    	<node>
    		<node>2.1
    			<node>2.1.1</node>
    			<node>2.1.2</node>
    		</node>
    		<node>
    			<node>2.2.1</node>
    		</node>
    		<node>
    			<node>2.3.1</node>
    			<node>2.3.2</node>
    			<node>2.3.3</node>
    		</node>
    	</node>
    	<node/>
    </tree>
    Ich bin mir nicht sicher, ob du das auch erlauben willst.

    Comment


    • #3
      Ja, perfekt! Das ist genau was mir gefehlt hat.

      Ich werde das XSD später sicherlich noch erweitern müssen, aber für den Moment ist es exakt das, was ich brauche, um wenigstens die typischen Datenstrukturen abbilden zu können.

      Vielen Dank!
      --
      Cheers Vince

      Comment

      Working...
      X