| 

.NET C# Java Javascript Exception

0
Was ist an diesem XML Schema falsch? Bzw. wie lautet es richtig?

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Kundendaten">
<xs:complexType>
<xs:sequence>
<xs:element ref="Kunde" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Vorname" type="xs:string"/>
<xs:element name="Name" type="xs:string"/>
<xs:element name="Firma" type="xs:string"/>
<xs:group name="komplett">
<xs:all>
<xs:element ref="Name" maxOccurs="1"/>
<xs:element ref="Vorname" maxOccurs="1"/>
<xs:element ref="Firma" maxOccurs="1" minOccurs="0"/>
</xs:all>
</xs:group>
<xs:element name="Kunde">
<xs:complexType>
<xs:choice>
<xs:element ref="Firma"/>
<xs:group ref="komplett" minOccurs="1" maxOccurs="1"/>
</xs:choice>
<xs:attribute name="id" type="xs:integer" use="required"/>
</xs:complexType>
</xs:element>
</xs:schema>
08.09.2009
Wiedsche 3 3
jor 791 2 7
Ich kann da so keinen syntaktischen oder logischen Fehler erkennen.
Gibt es denn Probleme mit einem bestimmten XML-Dokument zu diesem Schema ?
MiW 08.09.2009
1
Hmm, an diesem Schema ist noch ein Bisschen mehr komisch.
Es definiert auch XML-Dokumente als gültig, die nur "<Firma>irgendwas</Firma>" oder "<Name>irgendwas</Name>" o.Ä. als einziges Tag enthalten und mehr darf dort dann auch nicht stehen, sonst wird's ungültig.

Welche Struktur sollen denn die XML-Dokumente nachher haben bzw. welche Daten sollen sie enthalten?
pocketdevel 08.09.2009
3 Antworten
3
Zweiter Versuch,.. bei meiner ersten Antwort hatte ich mich irgendwie zu sehr auf die Ein/Zweideutigkeit konzentriert... Das ist aber nur ein Problem:
Ein All-Konstrukt muss immer das gesamte Inhaltsmodell definieren und kann nicht als Partikel auftreten.
Frag mich nicht warum, aber so steht es (natürlich verklausuliert) in der W3C Empfehlung.
So etwas wie
<xs:element ref="x" />
<xs:all>
...
</xs:all>

ist also nicht drin. Man darf noch nichtmal auf eine Gruppe Verweisen die ein xs:all beinhaltet.
Das ganze ohne all:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Kundendaten">
<xs:complexType>
<xs:sequence>
<xs:element ref="Kunde" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Vorname" type="xs:string"/>
<xs:element name="Name" type="xs:string"/>
<xs:element name="Firma" type="xs:string"/>

<xs:element name="Kunde">
<xs:complexType>
<xs:choice>
<xs:sequence>
<xs:element ref="Firma"/>
<xs:sequence minOccurs="0">
<xs:choice>
<xs:sequence>
<xs:element ref="Name"/>
<xs:element ref="Vorname"/>
</xs:sequence>
<xs:sequence>
<xs:element ref="Vorname"/>
<xs:element ref="Name"/>
</xs:sequence>
</xs:choice>
</xs:sequence>
</xs:sequence>
<xs:sequence>
<xs:element ref="Vorname"/>
<xs:choice>
<xs:sequence>
<xs:element ref="Firma"/>
<xs:element ref="Name"/>
</xs:sequence>
<xs:element ref="Name"/>
</xs:choice>
</xs:sequence>
</xs:choice>
<xs:attribute name="id" type="xs:integer" use="required"/>
</xs:complexType>
</xs:element>
</xs:schema>

Hoffe das ist gleichwertig. Mein selbst geschriebener Validator kann mit solchen all-Klauseln umgehen!!!
08.09.2009
Michri 236 2
2
Hallo
Das Problem bei deinem Schema ist eine Zweideutigkeit. Wenn ein Kunde anfängt mit
<Kunde>
<Firma> Blah </Firma>
...

dann ist für den Validator nicht klar, ob er in der Gruppe "komplett" oder der einzelnen Element-Referenz zu "Firma" ist. Genau das ist aber vom W3C gefordert (achtung schwer verständlich): Unique Particle Attribution (§3.8.6)

Jetzt meine Version, die IMHO nicht das Problem aufweist, aber die gleiche Semantik hat.
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Kundendaten">
<xs:complexType>
<xs:sequence>
<xs:element ref="Kunde" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Vorname" type="xs:string"/>
<xs:element name="Name" type="xs:string"/>
<xs:element name="Firma" type="xs:string"/>
<xs:group name="ohneFirma">
<xs:all>
<xs:element ref="Name" maxOccurs="1"/>
<xs:element ref="Vorname" maxOccurs="1"/>
</xs:all>
</xs:group>
<xs:group name="ohneName">
<xs:all>
<xs:element ref="Vorname" maxOccurs="1"/>
<xs:element ref="Firma" maxOccurs="1" minOccurs="0"/>
</xs:all>
</xs:group>
<xs:group name="ohneVorname">
<xs:all>
<xs:element ref="Name" maxOccurs="1"/>
<xs:element ref="Firma" maxOccurs="1" minOccurs="0"/>
</xs:all>
</xs:group>
<xs:element name="Kunde">
<xs:complexType>
<xs:choice>
<xs:sequence>
<xs:element ref="Firma"/>
<xs:group ref="ohneFirma" minOccurs="0" maxOccurs="1" />
</xs:sequence>
<xs:sequence>
<xs:element ref="Name"/>
<xs:group ref="ohneName" />
</xs:sequence>
<xs:sequence>
<xs:element ref="Vorname"/>
<xs:group ref="ohneVorname" />
</xs:sequence>
</xs:choice>
<xs:attribute name="id" type="xs:integer" use="required"/>
</xs:complexType>
</xs:element>
</xs:schema>

So weit ich weiß gibt es immer eine solche Transformation in eine eindeutige Grammatik.
08.09.2009
Michri 236 2
0
Leider tritt in deinem Vorschlag das gleiche Problem auf. Es lautet:

<xs:all minOccurs="0"> (das sich auf eine 'all' Elementgruppe bezieht) muss der äußerste Teil eines Inhaltsmodells sein und erfordert maxOccurs='1'.

Die Meldung bezieht sich auf die Zeile:

<xs:group ref="ohneFirma" minOccurs="0" maxOccurs="1" />


Lässt man diese Zeile weg, dann tritt der Fehler in der jeweils nächsten Referenz auf feine Gruppe auf.

Ohne die Gruppen funktioniert es übrigens. Jedoch wollte ich erreichen, dass die Felder Vorname, Nachname und Firma in einer beliebigen Reihenfolge angegeben werden dürfen.

Hier der code ohne Gruppen:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Vorname" type="xs:string" />
<xs:element name="Name" type="xs:string" />
<xs:element name="Firma" type="xs:string" />
<xs:element name="Kundendaten">
<xs:complexType>
<xs:sequence>
<xs:element ref="Kunde" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Kunde">
<xs:complexType>
<xs:choice>
<xs:element ref="Firma"/>
<xs:sequence>
<xs:element ref="Name"/>
<xs:element ref="Vorname"/>
<xs:element ref="Firma" minOccurs="0"/>
</xs:sequence>
</xs:choice>
<xs:attribute name="id" type="xs:integer" use="required"/>
</xs:complexType>
</xs:element>
</xs:schema>
08.09.2009
Wiedsche 3 3

Stelle deine Xml-Frage jetzt!