tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
13
ZUGRIFFE
702
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    chriss_2oo4 chriss_2oo4 ist offline Mitglied Gold
    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
     

  2. #2
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.335
    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
     
    Es ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)

  3. #3
    chriss_2oo4 chriss_2oo4 ist offline Mitglied Gold
    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
     

  4. #4
    limago limago ist offline Mitglied Brokat
    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üße
     
    I didn't write this; a very complex macro did.

  5. #5
    chriss_2oo4 chriss_2oo4 ist offline Mitglied Gold
    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:

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

  6. #6
    limago limago ist offline Mitglied Brokat
    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.

  7. #7
    chriss_2oo4 chriss_2oo4 ist offline Mitglied Gold
    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
     

  8. #8
    limago limago ist offline Mitglied Brokat
    Registriert seit
    May 2007
    Ort
    Riedstadt (Hessen)
    Beiträge
    354
    Zitat Zitat von chriss_2oo4 Beitrag anzeigen
    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.

    Zitat Zitat von chriss_2oo4 Beitrag anzeigen

    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.

    Zitat Zitat von chriss_2oo4 Beitrag anzeigen


    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...
     
    I didn't write this; a very complex macro did.

  9. #9
    chriss_2oo4 chriss_2oo4 ist offline Mitglied Gold
    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
     

  10. #10
    chriss_2oo4 chriss_2oo4 ist offline Mitglied Gold
    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:
    <?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 :
    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
     

  11. #11
    limago limago ist offline Mitglied Brokat
    Registriert seit
    May 2007
    Ort
    Riedstadt (Hessen)
    Beiträge
    354
    Zitat Zitat von chriss_2oo4 Beitrag anzeigen
    - Jedes Attribut muss in einem eigenen Tag definiert werden?
    Ja. Wenn bestimmte Attributkombinationen häufiger auftreten, kann man sie mit<xs:attributeGroup> zusammenfassen. Dann brauchst Du nur noch die Gruppe einzufügen.

    Zitat Zitat von chriss_2oo4 Beitrag anzeigen
    -
    - 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>
    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>

    Zitat Zitat von chriss_2oo4 Beitrag anzeigen
    -


    - innerhalb von Kompositionselemente (sequence, choice und all) kann ich schon weitere komplexe Datentypen definieren?
    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.

  12. #12
    limago limago ist offline Mitglied Brokat
    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. #13
    limago limago ist offline Mitglied Brokat
    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.

  14. #14
    chriss_2oo4 chriss_2oo4 ist offline Mitglied Gold
    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

  1. XML Schema - Variabler Name
    Von Chemosh im Forum XML Technologien
    Antworten: 0
    Letzter Beitrag: 26.01.09, 11:14
  2. XML Schema - xsd?
    Von flashray im Forum XML Technologien
    Antworten: 0
    Letzter Beitrag: 27.11.07, 18:22
  3. xml Schema
    Von karloh im Forum XML Technologien
    Antworten: 0
    Letzter Beitrag: 13.01.07, 11:10
  4. XML - Schema
    Von downset04 im Forum XML Technologien
    Antworten: 0
    Letzter Beitrag: 04.12.05, 14:09
  5. Oracle - Tabelle von einem Schema in ein anderes Schema verschieben
    Von Plumpsi im Forum Relationale Datenbanksysteme
    Antworten: 0
    Letzter Beitrag: 15.09.04, 10:26