XML Schema
Inno
- xml
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:
Hoffe ihr hilft mir in den 3 Punkten weiter.
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
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 erlaubtMfG
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
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:
MfG
Rouven
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
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
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....
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