Inno: XML Schema

Heyho Leute,
ich habe mich mal etwas mehr mit cem XML Schema befasst
und nun bin ich auf ein Problem gestoßen, dass
ich nicht zu lösen weiß, daher hoffe ich auf eure Hilfe.

Folgende XML soll einem Schema unterliegen:

  
<?xml version='1.0'?>  
<?xml-stylesheet type="text/css" href="http://css.adiolis.com/application.css"?>  
  
<application key="Wiki" xmlns="http://www.w3schools.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="application.xsd">  
  
	<information>  
		<version>1.00</version>  
		<name>Wiki Application</name>  
		<date>2009-10-07</date>  
		  
		<description>Das Wiki System besitzt komfortable Funktionen, die ermöglichen, dass mehrere Nutzer an Artikeln arbeiten können.</description>  
		  
		<author>Peter Lustig</author>  
		<authorEmail>PeterLustig@zdf.de</authorEmail>  
		<authorWebsite>PeterLustig.zdf.de</authorWebsite>  
		  
		<direction>ACS/Wiki/</direction>  
		<controller class="Wiki_Controller">Controller.php</controller>  
	</information>  
	  
	<requires>  
		<module minversion="1.0">Database</module>  
		<module minversion="1.1">Template</module>  
		<file>Adiolis.php</file>  
	</requires>  
	  
</application>  

Folgende Elemente müssen nicht in der XML definiert sein:

<authorEmail>PeterLustig@zdf.de</authorEmail>  
<authorWebsite>PeterLustig.zdf.de</authorWebsite>  
<module minversion="1.1">Template</module>  
<file>Adiolis.php</file>  

Die Kindelemente von requires besitzen keine bestimmt anzahl und reihenfolge.

Nun gut, hatte schon viele Ansätze, hab letztendlich vieles vereinfacht, aber letztendlich muss es doch eine lösung geben.

Der einfache Ansatz von mir sieht so aus:

  
<?xml version="1.0"?>  
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.w3schools.com" xmlns="http://www.w3schools.com" elementFormDefault="qualified">  
  
	<xs:element name="application" type="application"/>  
	  
	<xs:complexType name="application">	  
		<xs:sequence>		  
			<xs:element name="information" type="information"/>  
			<xs:element name="requires" type="requires"/>  
		</xs:sequence>  
		<xs:attribute name="name" type="xs:string" use="required" />	  
	</xs:complexType>  
	  
	  
	<xs:complexType name="requires">  
		<xs:sequence>	  
			<xs:element name="file" type="xs:string"/>  
			<xs:element name="module" type="xs:string"/>  
		</xs:sequence>  
		<xs:attribute name="minversion" type="xs:decimal" default="1.0"/>  
	</xs:complexType>  
			  
	<xs:complexType name="information">  
		<xs:all>  
			<xs:element name="name" type="xs:string"/>  
			<xs:element name="version" type="xs:decimal"/>  
			<xs:element name="date" type="xs:date"/>  
			<xs:element name="description" type="xs:string"/>  
			<xs:element name="author" type="xs:string"/>  
			<xs:element name="authorEmail" type="xs:string"/>  
			<xs:element name="authorWebsite" type="xs:string"/>  
			<xs:element name="direction" type="xs:string"/>	  
			<xs:element name="controller" type="controller" />  
		</xs:all>  
	</xs:complexType>  
	  
	  
	<xs:simpleType name="controller">  
 		<xs:restriction base="xs:string"/>  
	</xs:simpleType>	  
	<xs:attribute name="class" type="xs:string" />  
	  
</xs:schema>  

Was fehlt:

  • Attribut class funktioniert nicht, wie er soll
  • authorEmail, authorWebsite sind required
  • Kindelemnte von requires sind nicht beliebig

Hoffe ihr hilft mir in den 3 Punkten weiter.

  1. Hello,

    ich nicht zu lösen weiß, daher hoffe ich auf eure Hilfe.

    versuchen wir's mal...

    • Attribut class funktioniert nicht, wie er soll

    es hängt da etwas im luftleeren Raum, du solltest es dem Type/Element zuordnen, wo es hingehört

    • authorEmail, authorWebsite sind required

    schau dir mal das Attribut "minOccurs" an.

    • Kindelemnte von requires sind nicht beliebig

    definiere beliebig:
    (1) beide da, aber beliebige Reihenfolge
    (2) mindestens eines von beiden
    (3) alle Kombinationen und Wiederholungen erlaubt
    (4) alles erlaubt

    MfG
    Rouven

    --
    -------------------
    sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
    Buy when there's blood running in the street and sell when everyone is pounding at your door, clawing to own your equities  --  Wisdom on Wallstreet
    1. Hello,

      ich nicht zu lösen weiß, daher hoffe ich auf eure Hilfe.
      versuchen wir's mal...

      • Attribut class funktioniert nicht, wie er soll
        es hängt da etwas im luftleeren Raum, du solltest es dem Type/Element zuordnen, wo es hingehört
      • authorEmail, authorWebsite sind required
        schau dir mal das Attribut "minOccurs" an.
      • Kindelemnte von requires sind nicht beliebig
        definiere beliebig:
        (1) beide da, aber beliebige Reihenfolge
        (2) mindestens eines von beiden
        (3) alle Kombinationen und Wiederholungen erlaubt
        (4) alles erlaubt

      MfG
      Rouven

      Hey Rouven,
      schonmal danke für die Hilfe:

      <xs:simpleType name="controller">  
      

      <xs:restriction base="xs:string"/>
      <xs:attribute name="class" type="xs:string" />
      </xs:simpleType>

      Packe ich das Attribut hinein bekomme ich ein Validation error....

      authorEmail, authorWebsite sollen eben nicht unbedingt vorkommen.
      Hab mich vlt. etwas kompliziert ausgedrückt. An dem hapert es eben.

      Beliebig... Dass die Elemente nicht unbedingt vorkommen müssen, die Reihenfolge und Anzahl nicht gegeben ist.

      Schonmal danke,
      Inno

      1. Hello,

        [...]

        bitte unterlasse komplette Zitate, die machen wenig Sinn...

        <xs:simpleType name="controller">
        <xs:restriction base="xs:string"/>
        <xs:attribute name="class" type="xs:string" />
        </xs:simpleType>

        ja, der SimpleType reagiert nicht gut auf Attribute, du musst einen ComplexType nehmen, dem du simple content verpasst, siehe
        simpleContent

        Beliebig... Dass die Elemente nicht unbedingt vorkommen müssen, die Reihenfolge und Anzahl nicht gegeben ist.

        dann kombinierst du am Besten zwei Konstrukte:

        • xsd:choice um die Wahl zwischen den beiden Elementen zu haben
        • minOccurs="0" maxOccurs="unbounded" für das xsd:choice um den Inhalt des selbigen beliebig oft wiederholen zu können.

        MfG
        Rouven

        --
        -------------------
        sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
        Don't expect anyone else to support you. Maybe you have a trust fund. Maybe you'll have a wealthy spouse. But you never know when either one might run out.  --  Mary Schmich (Chicago Tribune; 1997); Baz Luhrmann (1999), see http://en.wikipedia.org/wiki/Wear_Sunscreen
        1. Hab deine Tipps angewandt und erste Erfolge errungen...

          Prolem noch hierbei:

            
          	  
          	<xs:complexType name="requires">  
          		<xs:choice>  
          			<xs:element minOccurs="0" maxOccurs="unbounded" name="file">  
          				<xs:complexType>  
          					<xs:simpleContent>  
          						<xs:extension base="xs:string">  
          							<xs:attribute name="minversion" type="xs:double" />  
          						</xs:extension>  
          					</xs:simpleContent>  
          				</xs:complexType>			  
          			</xs:element>  
          			<xs:element minOccurs="0" maxOccurs="unbounded" name="module">  
          				<xs:complexType>  
          					<xs:simpleContent>  
          						<xs:extension base="xs:string">  
          							<xs:attribute name="minversion" type="xs:double" />  
          						</xs:extension>  
          					</xs:simpleContent>  
          				</xs:complexType>	  
          			</xs:element>  
          		</xs:choice>  
          	</xs:complexType>  
          
          

          Error:
          Element '{http://www.w3schools.com}file': This element is not expected. Expected is ( {http://www.w3schools.com}module )

          Sozusagen ist ein Mix wohl nicht möglich. (2 Module, 1 File).

          Weiteres Problem:
          Kann authorEmail und authorWebsite kein minOccurs zuweisen, weil sie sich in xs:all befinden. Wie soll ich das nun lösen?

          Vielen Dank für deine Hilfe,
          Inno

          1. Hello,

              <xs:choice>  
              </xs:choice>  
            

            Sozusagen ist ein Mix wohl nicht möglich. (2 Module, 1 File).

            doch, du musst aber nicht den Elementen sondern dem xsd:choice selbst das maxOccurs verpassen, wenn ich mich nicht ganz täusche.

            Kann authorEmail und authorWebsite kein minOccurs zuweisen, weil sie sich in xs:all befinden. Wie soll ich das nun lösen?

            na ja, der Sinn von xsd:all ist "alle", wenn du nicht alle willst, dann suchst du was anderes, z.B. xsd:sequence.

            MfG
            Rouven

            --
            -------------------
            sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
            Let Bygones Be Bygones  --  Robert Pitscottie: "Chronicles of Scotland"
            1. doch, du musst aber nicht den Elementen sondern dem xsd:choice selbst das
              maxOccurs verpassen, wenn ich mich nicht ganz täusche.

              Danke, hat geklappt... =)

              na ja, der Sinn von xsd:all ist "alle", wenn du nicht alle willst, dann
              suchst du was anderes, z.B. xsd:sequence.

              Da gibt es leider das Problem, dass keines passen möchte:
              sequence bedeutet, dass die Reihenfolge eingehalten werden muss
              all, dasa eben alle elemente vorkommen
              choice eben eine auswahl an elemente (mit minOccurs wie oft ein element vorkommen muss)

              Problem ist, dass ein Teil der Elemente vorkommen muss und ein teil beliebig ist. Dazu darf es eben keine feste reihenfolge geben.

              Eine Kombination wäre also nötig....
              Wie weiß ich leider nicht.

              Danke....

              1. Hello,

                Eine Kombination wäre also nötig....
                Wie weiß ich leider nicht.

                du kannst durchaus ein choice innerhalb einer sequence platzieren. Du musst dir nur selbst erstmal darüber klar werden, was denn erlaubte Kombinationen sind.

                MfG
                Rouven

                --
                -------------------
                sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
                When the only tool you've got is a hammer, all problems start to look like nails.