smk: rekursives XML Schema

Hallo allerseits,

habe schon viel gelesen und tagelang gesucht. Ich stecke fest und brauche Hilfe. Ich möchte gerne ein XML Schema erstellen, mit ich quasi einen Verzeichnisbaum beschreiben kann. Der Trick: ein Verzeichnis kann wiederum Verzeichnisse enthalten. Verzeichnisse und Dateien innerhalb eines Verzeichnisses können in beliebiger Anordnung und Anzahl vorkommen.

Alles was ich mir an Schema dafür ausdenke, kommt nicht durch den XML Schema Validator, weil die Referenzen irgendwie nicht aufgelöst werden können.

Hier mal ein XML Beispiel:
<tree>
  <dir>
    <dir>
      <file>1</file>
      <file>2</file>
      <dir>
        <file>12</file>
      </dir>
    </dir>
    <file>17</file>
  </dir>
  <file>28</file>
  <dir/>
</tree>

Meine Idee war:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="FileType" type="xsd:unsignedLong"/>
  <xsd:complexType name="DirItemType">
    xsd:choice
      <xsd:element name="dir" ref="DirType"/>
      <xsd:element name="file" ref="FileType"/>
    </xsd:choice>
  </xsd:complexType>
  <xsd:complexType name="DirType">
    xsd:sequence
      <xsd:element ref="DirItemType" minOccurs="0" maxOccurs="unbounded"/>
    </xsd:sequence>
  </xsd:complexType>
  <xsd:element name="tree" type="DirType"/>
</xsd:schema>

Der Schema Validator erzählt mir dazu:

Undefined element {None}:DirItemType referenced from content
Undefined element {None}:DirType referenced from content model

Wie man sieht: das soll mein erstes XML Schema werden. Ich hab schon zig XML Schema Tutorials durch, aber gerade das Thema rekursiver Strukturen wird nirgends beschrieben. :(

Hilfe! Danke schonmal.

Sebastian

  1. Das ist nicht so schwierig, du rufst den type einfach innerhalb der type deklarierung wieder auf. Allerdings hat dein xml beispiel konzeptionelle schwächen.

    Deine xml sollte etwa so aussehen (reihenfolge von dir und file beachten!):

    <tree xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="test.xsd">
        <dir>
            <dir>
                <dir>
                    <file>12</file>
                </dir>
                <file>1</file>
                <file>2</file>
            </dir>
            <file>17</file>
        </dir>
        <dir/>
        <file>28</file>
    </tree>

    Ein einfaches Schema test.xsd zu deinem Beispiel koennte so aussehen:

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <xs:element name="tree">
            xs:complexType
                xs:sequence
                    <xs:element name="dir" type="directoryType" minOccurs="0" maxOccurs="unbounded"/>
                    <xs:element name="file" type="fileType" minOccurs="0" maxOccurs="unbounded"/>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
        <xs:complexType name="directoryType">
            xs:sequence
                <xs:element name="dir" type="directoryType" minOccurs="0" maxOccurs="unbounded"/>
                <xs:element name="file" type="fileType" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
        <xs:simpleType name="fileType">
            <xs:restriction base="xs:double"/>
        </xs:simpleType>
    </xs:schema>

    Ein gute vorlage gibt es im cocoon framework, da gibt es ein gutes beispiel, wie inhaltsverzeichnisse in xml abgebildet werden sollten. Schaue mal und Dir generator beispiele an.

    Gruss, Holge r