XML-Schema

chriss_2oo4

Erfahrenes Mitglied
Hi,

in meinem Script zu XML einmal folgendes gesehen, wo ich den Unterschied nicht ganz verstehe:

Code:
<xsd:element name="Name1">
<xsd:complexType>
...
</xsd:complexType>
</xsd:element>

und dann noch

Code:
<xsd:complexType name="Name2">
...
</xsd:complexType>

Was genau ist der Unterschied und warum wird ein komplexer Datentyp innerhalb eines Elements definiert und der andere nicht?

Lg Chriss
 
Hallo,

mit der ersten Definition wird ein neues Element mit einem Typ angelegt. Kann man nutzen, wenn man einen Element-Typ nur einmal nutzt.

Beim der zweiten Definition, wird ein Typ definiert, von dem man mehrere Elemente anlegen kann.

MFG

Sascha
 
Hi,

vielen Dank für die schnelle Antwort.

Also gibt es keinen Unterschied, außer dass ich beim zweiten Beispiel den Typ noch in min. ein Element einbetten muss.

Kann man dann die Kardinalitäten auch im zweiten Beispiel direkt bei der Definition angeben, weil das ist ja nicht immer sinnvoll?





Code:
<xsd:complexType name="PersonTyp">
<xsd:element name="Name" type="xsd:string"/>
<xsd:element name="Adresse" type="xsd:string"/>
...
</xsd:complexType>


<xsd:element name="Personen">
<xsd:complexType>
<xsd:elemlent name="Person" type="PersonTyp" minOccurs="1" maxOccurs="unbounded"/>
</xsd:complexType>
</xsd:element>

Stimmt das so? .> wenn ja, was ist dann der Unterschied zu den Referenzen (ref)?

Lg Chriss
 
Alle Elemente die direkt unterhalb von schema hängen sind global, alle die tiefer hängen sind lokal. Nur globale Elemente können mit den Attributen base, type oder ref referenziert werden.


In Deinem beispiel erzeugst Du zwei Elementdefinitionen. Eine globale und eine lokale, da Du das Attribute "name" verwendest. Hättest Du stattdessen "ref" verwendet, dann wird auf das globale Element verwiesen und Du hast nur noch eine Elementdefinition.

Im ersten Fall können die beiden Elemente von verschiedenen Typen sein, im zweiten Fall nicht.

Anden globalen Elementdefinitionen kann man keine Kardinalitäten angeben. Ist auch nicht sinnvoll, weil die Elemente in verschiedenen Kontexten verschiedene Kardinalitäten haben könnten und weil globale Elemente potenzielle rootelemente sind. Ein rootelement kann aber nur einmal vorkommen.

Die globalen Definitionen sind oft besser, als die globalen. Außerdem halten Sie das Schemafile wartbarer.

Grüße
 
Hi,

nochmals danke

aber was ich jetzt nicht ganz verstehe:

was ist der Unterschied wenn ich am Anfang einen Typ definiere den dann in der Elementdefinition als Type angebe oder wenn ich ein Element definiere und darauf mit ref referenziere?


Und das versteh ich auch nicht ganz:

Die globalen Definitionen sind oft besser, als die globalen. Außerdem halten Sie das Schemafile wartbarer.

Lg Chriss
 
XML:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

	<!-- Dieser complexType ist global weil er ein Kind von schema ist. Er kann wiederverwendet werden oder beerbt werden -->
	<xsd:complexType name="PersonTyp">
		<xsd:sequence>
			<!-- Dies ist ein lokales Element, weil es kein Kind von schema sondern von sequence ist. Es kann nicht referenziert werden. -->
			<xsd:element name="Name" type="xsd:string"/>
			<!-- Dies ist eine Referenz auf ein globales Element. 
				Das Element muss exisitieren und ein Kind von Schema sein. 
				Die Referenz immer den Typ des globalen Elements 
			-->
			<xsd:element ref="Adresse" />
		</xsd:sequence>		
	</xsd:complexType>

	<!-- Dieses Element ist global weil es ein Kind von schema ist. Es kann ein Rootelement sein, muss aber nicht -->
	<xsd:element name="Personen">
		<!-- Dieser complexType ist lokal weil er kein Kind von schema ist. Er kann NICHT wiederverwendet werden oder beerbt werden -->
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element name="Person" type="PersonTyp" minOccurs="1" maxOccurs="unbounded"/>
			</xsd:sequence>	
		</xsd:complexType>
	</xsd:element>
	
	<!-- Dieser Element ist global weil es ein Kind von schema ist. Es kann ein Rootelement sein, muss aber nicht -->
	<xsd:element name="Adresse" type="xsd:string"/>

</xs:schema>

so sieht das mit reinen globalen Definitionen aus:

XML:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">


	<xsd:element name="Personen" type="PersonenTyp" />
	<xsd:element name="Person" type="PersonTyp" />
	<xsd:element name="Name" type="xsd:string"/>
	<xsd:element name="Adresse" type="xsd:string"/>
	
	<xsd:complexType name="PersonenTyp">
		<xsd:sequence>
			<xsd:element ref="Person" minOccurs="1" maxOccurs="unbounded"/>
		</xsd:sequence>	
	</xsd:complexType>
	
	
	<xsd:complexType name="PersonTyp">
		<xsd:sequence>
			<xsd:element ref="Name"/>
			<xsd:element ref="Adresse" />
		</xsd:sequence>		
	</xsd:complexType>

</xs:schema>

Es ist alles etwas aufgeräumter, Du bekommst keine tiefen Verschaltelungen, was das File besser wartbar macht. Und das Schema funktioniert für alle Teilbäume, dh. Person, oder Name, oder Adresse können im XML-File als Rootelement stehen und es wird trotdem validiert.
 
Zuletzt bearbeitet von einem Moderator:
Hi,

und nochmal vielen Dank für Deine Hilfe!


So wie ich das jetzt in deinem Beispiel aufgefasst habe, werden Referenzen (ref) auf primitive Datentypen wie xsd:string oder xsd:integer angewandt und sind somit global erreichbar, falls sie Kinder von schema sind.

Komplexe Typdefinitionen oder einfache Typendefinitionen, z. B. mit Einschränkungen, können nicht referenziert (ref) werden, sondern müssen global definiert werden um in verschiedenen Kontexten verwendet werden zu können?

Darf man nur bei Referenzen (ref) keine Kardinalitäten angeben, oder auch bei globlaen Typdefinitionen -> da macht es ja eigentlich auch keinen Sinn (außer für die Kinder der globalen Typdefiniton)?


Lg Chriss
 
Hi,

und nochmal vielen Dank für Deine Hilfe!


So wie ich das jetzt in deinem Beispiel aufgefasst habe, werden Referenzen (ref) auf primitive Datentypen wie xsd:string oder xsd:integer angewandt und sind somit global erreichbar, falls sie Kinder von schema sind.

Nö. Referenzen zeigen nie auf Typen. Das geht auch gar nicht. Referenzen zeigen immer auf Elemente. Von welchem Typ das Element dabei ist (primitiv oder komplex), ist völlig egal. Global erreichbar sind sie, wenn sie Kinder von Schema sind, das ist richtig.

Komplexe Typdefinitionen oder einfache Typendefinitionen, z. B. mit Einschränkungen, können nicht referenziert (ref) werden, sondern müssen global definiert werden um in verschiedenen Kontexten verwendet werden zu können?

Nochmal Type können nicht referenziert werden. Aber in einem type-Attribut, oder in einem base-Attribut kann ein Typ stehen. Dieser muss global sein. In einem ref-Attribut kann nur auf ein Element verwiesen werden, das aber auch global sein muss.

Ansonsten stimmt das. Wenn Du Dinge also Elemente, Gruppen oder Typen in verschiedenen Kontekten verwenden willst, müssen sie global sein.

Darf man nur bei Referenzen (ref) keine Kardinalitäten angeben, oder auch bei globlaen Typdefinitionen -> da macht es ja eigentlich auch keinen Sinn (außer für die Kinder der globalen Typdefiniton)?

Die Aussage verstehe ich nicht ganz. Wenn innerhalb einer Typdefinition auf ein globales Element refenziert wird (siehe mein rein globales Beispiel mit Person in Personentyp), dann steht die Kardinalität natürlich an der Referenz und nicht an der globalen Definition. Verschiedene Typen könnten das globale Element ja mit verschiedenen Kardinalitäten ansprechen.

Hoffe es ist jetzt ein wenig klarer...
 
Des Weiteren sind beim Einsatz von Schema noch ein paar Unklarheiten aufgetreten.

- Jedes Attribut muss in einem eigenen Tag definiert werden?
- Wenn ich ein leeres Element habe (in DTD EMPTY) kann ich das dann wie folgt angeben?

Code:
<xsd:complexType name="program">
		<xsd:sequnce/>
		<xsd:attribute name="name" type="xsd:string"/>
		<xsd:attribute name="os" type="xsd:string"/>
		<xsd:attribute name="version" type="xsd:string"/>
	</xsd:complexType>




- innerhalb von Kompositionselemente (sequence, choice und all) kann ich schon weitere komplexe Datentypen definieren?



Schonmal Danke

Lg Chriss
 
Hi,

welch ein Zufall limago hast mir gerade auf meine Antwort geatwortet als ich schon wieder ne neue Frage gestellt hab -> also nochmal vielen Dank und sorry falls ich aufm Schlauch stehe.

Ich verstehe den Unterschied zwar, aber nicht wann man welches einsetzt. Ich versuche es mal anhand von einem Beispiel zu erklären:

XML-Dokument das validiert werden soll:
<?xml version="1.0" encoding="UTF-8?>
<config>
<programm name="AppName" os="Windows" version="1.00"/>
<param name="TmpDir" value="./tmp/"/>
<param name="LogDir" value="./log/"/>
<!-- Beliebig viele param-Elemente -->
</config>

Schema-Datei:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
	
	<xsd:element name="program">
		<xsd:complexType>
			<xsd:sequnce/>
			<xsd:attribute name="name" type="xsd:string"/>
			<xsd:attribute name="os" type="xsd:string"/>
			<xsd:attribute name="version" type="xsd:string"/>
		</xsd:complexType>
	</xsd:element>
	
	<xsd:complexType name="paramType">
		<xsd:sequence/>
		<xsd:attribute name="name" type="xsd:string"/>
		<xsd:attribute name="value" type="xsd:string"/>
	</xsd:complexType>
	
	<xsd:element name="config">
		<xsd:complexType>
			<xsd:sequnce>
				<xsd:element ref="program"/>
				<xsd:element name="param" type="paramType" minOccurs="0" maxOccurs="unbounded"/>
			</xsd:sequnce>
		</xsd:complexType>
	</xsd:element>
</xsd:schema>

Einmal setze ich eine Typdefinition ein und einmal setze ich eine Referenz ein. Soweit ist doch beides syntaktisch richtig? Aber worin liegt der Unterschied?


Lg Chriss
 
Zurück