choice-Element mit minOccurs=0"

Status
Nicht offen für weitere Antworten.

fff

Mitglied
Hallo,

ich habe einen Kunden der behauptet folgende XML-Schema Definition ist nicht erlaubt:

Code:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
	<xs:element name="Test" type="TestType"/>
	<xs:complexType name="TestType">
		<xs:sequence>
			<xs:element name="ElemA" type="xs:string"/>
			<xs:choice>
				<xs:element name="CElem1" type="xs:string" minOccurs="0"/>
				<xs:element name="CElem2" type="xs:string" minOccurs="0"/>
			</xs:choice>
		</xs:sequence>
	</xs:complexType>
</xs:schema>

Die Choice-Elemente tragen alle die Attribute minOccurs="0". Ist dies erlaubt?

Mein Javaprogramm (auch mein XMLSpy) läßt das Schema zu und sagt auch, dass das folgendes Dokument gültig ist. Ist das richtig?

Code:
<?xml version="1.0" encoding="UTF-8"?>
	<Test>
		<ElemA>String</ElemA>
	</Test>


lg Flo
 

byte

Top Contributor
Bin mir nicht 100% sicher, aber ich denke auch, dass das so nicht korrekt ist. Choice will genau 1 Element haben, jedoch haben alle Elemente die Kardinalität 0..1.
Machs doch einfach so, dann stimmts auf jeden Fall und ist äquivalent zu dem von Dir gewünschten:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
   <xs:element name="Test" type="TestType"/>
   <xs:complexType name="TestType">
      <xs:sequence>
         <xs:element name="ElemA" type="xs:string"/>
         <xs:choice minOccurs="0">
            <xs:element name="CElem1" type="xs:string"/>
            <xs:element name="CElem2" type="xs:string"/>
         </xs:choice>
      </xs:sequence>
   </xs:complexType>
</xs:schema>
 

fff

Mitglied
Danke für die schnelle Antwort. Ich verstehe, dass ich es auch mit deiner XSD Variante ausdrücken kann.

Ich bräuchte nur eine definitive Aussage, ob mein Konstrukt XML Schema konform ist, oder nicht (auch wenn deine Variante viel aussagekräftiger ist)!

Warum läßt java das XSD zu und validiert das Dokument erfolgreich? Ist das nicht Aussage genug über die Gültigkeit des XSD-Konstrukts, oder kann ich mich auf das nicht verlassen?
 

byte

Top Contributor
Dafür musst Du mal einen Blick in die XML Schema Spezifikation werfen:
http://www.w3.org/XML/Schema#dev


Könnte durchaus sein, dass dieser Spezialfall in der Spezifikation gar nicht aufgeführt ist. Demnach wärs erlaubt. Könnte aber auch genauso gut sein, dass es laut Spezifikation verboten ist und die Java-Implementierung nicht ganz korrekt ist.
 

mikachu

Top Contributor
bei einem choice-element brauchst du gar keine häufigkeiten der auszuwählenden werte angeben, weil es in dieser auswahl nur EINMAL vorkommen DARF.

du könntest dem choice-element häufigkeiten zuordnen per minoccurs und maxoccurs, aber nicht den elementen... das wäre quatsch ;)

#edit 1:
wenn du den elementen per minoccurs oder maxoccurs werte zuordnest, würde ja folgendes zustande kommen, was nicht gewünscht ist:

<choice>
[ ] wert1
[ ] wert2
[ ] wert2
[ ] wert2
</choice>

das ist doch schon vom konzept her völlig überflüssig ;)

wenn, dann ist doch sicherlich sowas gewünscht:

<choice min=0 max=3>
[ ] wert1
[ ] wert2
</choice>

also die gesamte auswahl mehrfach bereitzustellen.

um auf deine frage zurückzukommen, warum das java richtig übersetzt ist folgende, dass in den restriktionen von minoccurs bzw maxoccurs steht, dass es überall vorkommen darf, ausser bei <schema>-elementen!
 

fff

Mitglied
du könntest dem choice-element häufigkeiten zuordnen per minoccurs und maxoccurs, aber nicht den elementen... das wäre quatsch
Warum quatsch?

Stell dir vor du möchtest folgenden beispielhaften Sachverhalt in ein XSD verpacken:

"Ein Mainboard kann entweder mit 1-n Intel-Prozessoren oder 1-n AMD Prozessoren bestückt werden."

Das dazu passende XSD wäre dann:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" 
attributeFormDefault="unqualified">
	<xs:element name="Mainboard" type="TestType"/>
	<xs:complexType name="MainBoardType">
		<xs:sequence>
			<xs:element name="Title" type="xs:string"/>
			<xs:choice>
				<xs:element name="Intel" type="xs:string" minOccurs="1" maxOccurs="unbounded"/>
				<xs:element name="AMD" type="xs:string" minOccurs="1" maxOccurs="unbounded"/>
			</xs:choice>
		</xs:sequence>
	</xs:complexType>
</xs:schema>

Es gibt sicherlich bessere Beispiele und mir ist auch klar das es auch für obiges XSD andere Lösungswege gibt! Trotzdem finde ich es nicht so abwegig minOccurs und maxOccurs auch in den Elementen zu erlauben!

Habe mir mal unter http://www.w3.org/TR/xmlschema-1 die Spec angeschaut:

Hier ein kleiner Auszug:

3.8.1 The Model Group Schema Component

The model group schema component has the following properties:

Schema Component: Model Group

{compositor} One of all, choice or sequence.
{particles} A list of particles
{annotation} Optional. An annotation.

specifies a sequential (sequence), disjunctive (choice) or conjunctive (all) interpretation of the {particles}. This in turn determines whether the element information item [children] •validated• by the model group must:

• (sequence) correspond, in order, to the specified {particles};
(choice) corresponded to exactly one of the specified {particles};
• (all) contain all and only exactly zero or one of each element specified in {particles}. The elements can occur in any order. In this case, to reduce implementation complexity, {particles} is restricted to contain local and top-level element declarations only, with {min occurs}=0 or 1, {max occurs}=1.

...

3.8.6 Constraints on Model Group Schema Components

Schema Component Constraint: Effective Total Range (choice)

The effective total range of a particle whose {term} is a group whose {compositor} is choice is a pair of minimum and maximum, as follows:

minimum:
The product of the particle's {min occurs} and the minimum of the {min occurs} of every wildcard or element declaration particle in the group's {particles} and the minimum part of the effective total range of each of the group particles in the group's {particles} (or 0 if there are no {particles}).

maximum:
unbounded if the {max occurs} of any wildcard or element declaration particle in the group's {particles} or the maximum part of the effective total range of any of the group particles in the group's {particles} is unbounded, or if any of those is non-zero and the {max occurs} of the particle itself is unbounded, otherwise the product of the particle's {max occurs} and the maximum of the {max occurs} of every wildcard or element declaration particle in the group's {particles} and the maximum part of the effective total range of each of the group particles in the group's {particles} (or 0 if there are no {particles}).


Leider ist die Spec für mich nicht 100% verständlich :-((( Ich kann aber nirgends in der Spec finden, dass minOccurs und maxOccurs bei "Choices"-Unterelementen (particles, oder?) nicht erlaubt wären, oder?

Ich verstehe die Spec so:
Bei choice darf nur genau eins der Unterelemente im Dokumente vorkommen. Die Elementanzahl des ausgewählten Elements wird durch minOccurs und maxOccurs festgelegt (Standard: minOccurs=1 und maxOccurs=1).

Kann dies jemand bestätigen, oder natürlich auch widerlegen?

lg Florian
 

mikachu

Top Contributor
fff hat gesagt.:
"Ein Mainboard kann entweder mit 1-n Intel-Prozessoren oder 1-n AMD Prozessoren bestückt werden."

das sieht für mich wie 2 eingabefelder aus.

1. anzahl prozessoren -> texteingabe
2. auswahl prozessoren -> choice
 

byte

Top Contributor
Offenbar ist es nicht verboten, alle Elemente im Choice mit minOccurs=0 zu versehen, wenn auch ziemlich sinnlos (siehe mikachu). Im Endeffekt macht nur ne maxOccurs=n (mit n > 1) als Kardinalität im Choice Sinn oder halt gar keine (also minOccurs = maxOccurs = 1).
 

fff

Mitglied
danke, so sehe ich es natürlich auch. Leider betreiben wir eine Schnittstelle in der sich eine solche Choice (mit minOccurs="0" Elementen) eingeschlichen hat :-( und ein Kunde behauptet dies sei nach XML Schema Spec nicht erlaubt...
 

mikachu

Top Contributor
aber wo besteht denn ein zweifel?

es ist erlaubt!
kann er ruhig angeben, wird aber nix bringen ^^

gib mal die telefonnummer von ihm, ich erklär ihm das *lol*

dann soll er mal die spec's zeigen, wo das geschrieben steht, dass es nicht vorkommen DARF
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
R XSD in einer choice mehrmals das selbe element möglich XML & JSON 5
8u3631984 jaxb XML Mapper - Root Element mit Attribut XML & JSON 20
B DOMParser - Element filtern XML & JSON 1
N jdom2 - Referenz auf Nested Element XML & JSON 2
H XML Element `Class` wird nicht gelesen XML & JSON 2
F xml Element ersetzen XML & JSON 5
M Text eines Elements in XML Datei mit JAVA bearbeiten und kompletten Element-Zweig hinzufügen XML & JSON 16
W XML-Element komplett löschen XML & JSON 5
L XML nur ein Element einlesen XML & JSON 2
S JDom XML ein Element hinzufügen. XML & JSON 1
ARadauer xsd ref auf element oder typen verwenden? XML & JSON 2
R cvc-complex-type.3.2.2: Attribute 'uuid' is not allowed to appear in element 'jasperReport'. XML & JSON 4
F EMF, XSD to ECore mapping, Attribute vs. Element XML & JSON 2
C xml validierung gegen xsd mit jdom: Fehlermeldung Cannot find the declaration of element ... XML & JSON 8
Landei JAXB: Wert von übergeordneten Element XML & JSON 4
N Alle namespaces ins Root Element hinauf ziehen XML & JSON 2
N Alle namespaces ins Root Element hinauf ziehen XML & JSON 2
S Validierung mit JAXB2 ohne root-element XML & JSON 10
E xml Element sortieren XML & JSON 2
T Xpath & JDOM Element Pfad ausgeben XML & JSON 2
Z XML parsen - Element mit Werten XML & JSON 2
enne87 Element-Werte werden falsch ausgelesen XML & JSON 2
M XSD - Child Element möglich, aber nicht zwingend erforderlich XML & JSON 6
N Individuelles Wrapper-Element um Collection mit JAXB XML & JSON 6
W Element mit XPath @id ermitteln wenn nur ein teil der id bekannt ist XML & JSON 2
R Element - Ausgeben von Kommentar XML & JSON 4
L Element manipulieren in einem DOMResult per XPath XML & JSON 10
G mit Transformer.transform ein Element überschreiben XML & JSON 2
G XSL: Element über eine Variable ermitteln XML & JSON 4
sparrow JDom Element.getChild("Name") liefert null obwohl vorhanden XML & JSON 4
B XML-Element als String ausgeben XML & JSON 5
L Element einlesen <Telefon name="Karl">134313 XML & JSON 2
S Cannot find the declaration of element XML & JSON 2
M Jaxb Annotationen, Wert als XML Element XML & JSON 2
O XML Element mit ":" im Namen XML & JSON 23
G Element mit Text und Unterelement XML & JSON 2
S Ampersand im Jdom-Element XML & JSON 2
C jdom.Element nicht vorhanden? XML & JSON 4
W JDOM element ändern funzt nich :( [problem gelöst] XML & JSON 3
M XML einlesen - prüfen ob Element vorhanden XML & JSON 2
X Xpath, alle Element die mit "user" beginnen auswäh XML & JSON 2
C Mehrere Element_Nodes zusammenfassen zu einem Element XML & JSON 9
K Auf bestimmtes Element im XML zugreifen XML & JSON 3
M JDOM und XPath, zu Element zugehörigen XPath-Ausdruck XML & JSON 5
H Adapter: String->Element bzw. Element->String XML & JSON 6
M JDOM Element ohne Inhalt kopieren ? XML & JSON 3
S String in element casten XML & JSON 2
S Element hinzufügen XML & JSON 2
B Element an bestimmter Stelle einfügen (JDOM) XML & JSON 8
S zum element Attribut xmlns zufügen XML & JSON 6
N bestimmtes Element auslesen - ich verzweifel XML & JSON 3
J [Newbie] [JDOM] Element aus XML entfernen klappt nicht XML & JSON 4
P [Solved] XSL: Element-Variable auslesen XML & JSON 2
Noar XSLT - Element-Wrapping XML & JSON 2
R JDOM Root-Element entfernen aber Rest behalten XML & JSON 10
S Element addContent(Element) gibts nicht XML & JSON 5
R node.getNodeValue() bringt mir komplettes CDATA-Element XML & JSON 3
W Element Liste in Root XML & JSON 5
D Text, String vor einem Root Element einfügen XML & JSON 2
W root element parsen,Hilfe! XML & JSON 5
E Element.setTextContent(String); Ersatz fuer Version 1.4? XML & JSON 3
A NullPointerException bei leerem Element XML & JSON 4
D XML: Element section content does not follow the DTD XML & JSON 6
clemson element mit id in jdom löschen XML & JSON 2
A Element an einer bestimmten Stelle einfügen (nicht am Ende) XML & JSON 4
R JDom: XML Code von Element, und: ist Element ein standalone XML & JSON 2

Ähnliche Java Themen

Neue Themen


Oben