ERLEDIGT
NEIN
NEIN
ANTWORTEN
13
13
ZUGRIFFE
702
702
EMPFEHLEN
-
12.07.08 13:22 #1
- Registriert seit
- Apr 2007
- Beiträge
- 194
Hi,
in meinem Script zu XML einmal folgendes gesehen, wo ich den Unterschied nicht ganz verstehe:
Code :1 2 3 4 5
<xsd:element name="Name1"> <xsd:complexType> ... </xsd:complexType> </xsd:element>
und dann noch
Code :1 2 3
<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
SaschaEs ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)
-
12.07.08 14:09 #3
- Registriert seit
- Apr 2007
- Beiträge
- 194
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 :1 2 3 4 5 6 7 8 9 10 11 12
<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
-
12.07.08 14:25 #4
- Registriert seit
- May 2007
- Ort
- Riedstadt (Hessen)
- Beiträge
- 354
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üßeI didn't write this; a very complex macro did.
-
12.07.08 14:46 #5
- Registriert seit
- Apr 2007
- Beiträge
- 194
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:
Lg ChrissDie globalen Definitionen sind oft besser, als die globalen. Außerdem halten Sie das Schemafile wartbarer.
-
12.07.08 16:43 #6
- Registriert seit
- May 2007
- Ort
- Riedstadt (Hessen)
- Beiträge
- 354
Code xml:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
<?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:
Code xml:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
<?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.I didn't write this; a very complex macro did.
-
13.07.08 12:13 #7
- Registriert seit
- Apr 2007
- Beiträge
- 194
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
-
13.07.08 15:23 #8
- Registriert seit
- May 2007
- Ort
- Riedstadt (Hessen)
- Beiträge
- 354
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.
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.
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...I didn't write this; a very complex macro did.
-
13.07.08 15:27 #9
- Registriert seit
- Apr 2007
- Beiträge
- 194
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 :1 2 3 4 5 6
<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
-
13.07.08 15:51 #10
- Registriert seit
- Apr 2007
- Beiträge
- 194
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:
Schema-Datei:<?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>
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
<?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
-
13.07.08 15:56 #11
- Registriert seit
- May 2007
- Ort
- Riedstadt (Hessen)
- Beiträge
- 354
Ja. Wenn bestimmte Attributkombinationen häufiger auftreten, kann man sie mit<xs:attributeGroup> zusammenfassen. Dann brauchst Du nur noch die Gruppe einzufügen.
Ja. Das leere Sequence-Element kannst Du weglassen. Kompliziert ist dieser Fall
Code xml:1
<a href="www.irgendwo.de">Link zu irgendwo</a>
dann sieht der Typ so aus:
Code xml:1 2 3 4 5 6 7
<xsd:complexType name="linkType"> <xsd:simpleContent> <xsd:extension base="xs:string"> <xsd:attribute name="href" type="xsd:anyURI"/> </xsd:extension> </xsd:simpleContent> </xsd:complexType>
Nö. Du kannst nur innerhalb von Elementen Typen definieren. Was Du tun könntest wäre z.B. dies
Code xml:1 2 3 4 5 6 7 8 9 10 11 12
<xsd:complexType name="emailType"> <xsd:sequence> <xsd:element ref="to" maxOccurs="unbounded" /> <xsd:element ref="from" /> <xsd:choice minOccurs="0" maxOccurs="unbounded"> <xsd:element ref="cc" /> <xsd:element ref="bcc" /> </xsd:choice> <xsd:element ref="subject" minOccurs="0" /> <xsd:element ref="body" /> </xsd:sequence> </xsd:complexType>
wenn Du z.B. beliebig viele cc und bcc's in beliebiger Reihenfolge zwischen from und subject zulassen willst. Dies ist aber keine lokale Typedefinition.I didn't write this; a very complex macro did.
-
13.07.08 16:11 #12
- Registriert seit
- May 2007
- Ort
- Riedstadt (Hessen)
- Beiträge
- 354
so würde ich das machen:
Code xml:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="config" type="configType"/> <xsd:element name="program" type="programType"/> <xsd:element name="param" type="paramType"/> <xsd:complexType name="programType"> <xsd:attribute name="name" type="xsd:string"/> <xsd:attribute name="os" type="xsd:string"/> <xsd:attribute name="version" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="paramType"> <xsd:attribute name="name" type="xsd:string"/> <xsd:attribute name="value" type="xsd:string"/> </xsd:complexType> <xsd:complexType type="configType"> <xsd:sequence> <xsd:element ref="program"/> <xsd:element ref="param" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:schema>
Manchmal kann es sogar sinvoll sein, die Attribute global zu machen.Geändert von limago (13.07.08 um 16:13 Uhr)
I didn't write this; a very complex macro did.
-
13.07.08 16:17 #13
- Registriert seit
- May 2007
- Ort
- Riedstadt (Hessen)
- Beiträge
- 354
da das Attrubut Name an verschiedenen Stellen vorkommt geht auch das:
Code xml:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="config" type="configType"> <xsd:element name="program" type="programType"> <xsd:element name="param" type="paramType"/> <xsd:attribute name="name" type="xsd:string"/> <xsd:complexType name="programType"> <xsd:attribute ref="name" /> <xsd:attribute name="os" type="xsd:string"/> <xsd:attribute name="version" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="paramType"> <xsd:attribute ref="name" /> <xsd:attribute name="value" type="xsd:string"/> </xsd:complexType> <xsd:complexType type="configType"> <xsd:sequence> <xsd:element ref="program"/> <xsd:element ref="param" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:schema>
I didn't write this; a very complex macro did.
-
13.07.08 17:52 #14
- Registriert seit
- Apr 2007
- Beiträge
- 194
Hi
limago ist echt nett von Dir dass du dir die Mühe gemacht und mir weitergeholfen hast!
Ich denke jetzt hab ich das auch verstanden -> aber so wie ich das im Beispiel gemacht habe würde es auch gehen -> So wie du es gemacht hast ist es sicher "sauberer" hab das nur zur als Beispiel einmal mit type und einmal mit ref gemacht
Lg Chriss
Ähnliche Themen
-
XML Schema - Variabler Name
Von Chemosh im Forum XML TechnologienAntworten: 0Letzter Beitrag: 26.01.09, 11:14 -
XML Schema - xsd?
Von flashray im Forum XML TechnologienAntworten: 0Letzter Beitrag: 27.11.07, 18:22 -
xml Schema
Von karloh im Forum XML TechnologienAntworten: 0Letzter Beitrag: 13.01.07, 11:10 -
XML - Schema
Von downset04 im Forum XML TechnologienAntworten: 0Letzter Beitrag: 04.12.05, 14:09 -
Oracle - Tabelle von einem Schema in ein anderes Schema verschieben
Von Plumpsi im Forum Relationale DatenbanksystemeAntworten: 0Letzter Beitrag: 15.09.04, 10:26





Zitieren


Login





