Wie erstelle ich in einem XML -Schema einen wiederverwendbaren "US -Status" -Typ?

StackOverflow https://stackoverflow.com/questions/227434

  •  03-07-2019
  •  | 
  •  

Frage

Ich habe ein XML -Schema, das mehrere Adressen enthält:

<xs:element name="personal_address" maxOccurs="1">
  <!-- address fields go here -->
</xs:element>
<xs:element name="business_address" maxOccurs="1">
  <!-- address fields go here -->
</xs:element>

In jedem Adresselement füge ich eine Aufzählung "US -Staat" hinzu:

<xs:simpleType name="state">
    <xs:restriction base="xs:string">
        <xs:enumeration value="AL" />
        <xs:enumeration value="AK" />
        <xs:enumeration value="AS" />
                ....
            <xs:enumeration value="WY" />
        </xs:restriction>
</xs:simpleType>

Wie schreibe ich einmal die Aufzählung der "US-Bundesstaat" und verwende sie in jedem meiner Adresselemente wieder? Ich entschuldige mich im Voraus, wenn dies eine N00B -Frage ist - ich habe noch nie einen XSD geschrieben.

Mein anfänglicher Stich ist Folgendes:

<xs:element name="business_address" maxOccurs="1">
  <!-- address fields go here -->
  <xs:element name="business_address_state" type="state" maxOccurs="1"></xs:element>
</xs:element>
War es hilfreich?

Lösung

Ich denke, Sie sind auf den richtigen Tracks. Ich denke, es ist mehr mit XML -Namespaces zu tun. Versuche Folgendes:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.example.org/foo"
    xmlns:tns="http://www.example.org/foo"
    elementFormDefault="qualified">
    <xs:element name="business_address">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="business_address_state"
                    type="tns:state" maxOccurs="1" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:simpleType name="state">
        <xs:restriction base="xs:string">
            <xs:enumeration value="AL" />
            <xs:enumeration value="AK" />
            <xs:enumeration value="AS" />
            <xs:enumeration value="WY" />
        </xs:restriction>
    </xs:simpleType>
</xs:schema>

Beachten Sie, dass der Typ ist TNS: Zustand nicht nur Zustand

Und dann würden Sie es so verwenden:

<?xml version="1.0" encoding="UTF-8"?>
<business_address xmlns="http://www.example.org/foo"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.example.org/foo foo.xsd ">
    <business_address_state>AL</business_address_state>
</business_address>

Beachten Sie, dass dieser XML einen Standard -Namespace verwendet wie der TargetNamePace des XSD

Andere Tipps

Während Namespaces dazu beitragen, Schemata organisieren und Konflikte zu verhindern, ist es nicht der oben genannte Namespace, der die Wiederverwendung ermöglicht, aber es ist die Platzierung des Typs als unmittelbares Kind deru003Cxs:schema> Wurzel, das es zu einem globalen Typ macht. (Nutzbar im Namespace mit dem Namespace -Qualifikationsmerkmal und von jedem Ort, an dem der TNS -Namespace mit dem TNS sichtbar ist: Qualifikationsspiel.)

Ich lieber, meine Schemata nach dem "Garden of Eden" -Ansatz zu konstruieren, der die Wiederverwendung von Elementen und Typen maximiert (und auch die externe logische Referenzierung des sorgfältig hergestellten einzigartigen Typs/Elements aus einem in einer Datenbank gespeicherten Datenwörterbuch erleichtern kann .

Beachten Sie, dass das Schema -Muster "Garten von Eden" die maximale Wiederverwendung bietet, aber auch die meisten Arbeiten beinhaltet. Am Ende dieses Beitrags habe ich Links zu den anderen in der Blog -Serie behandelten Mustern bereitgestellt.

Der Garten des Eden -Ansatzes http://blogs.msdn.com/skaufman/archive/2005/05/10/416269.aspx

Verwendet einen modularen Ansatz, indem alle Elemente weltweit definiert werden und wie der venezianische Blindeansatz alle Typdefinitionen weltweit deklariert werden. Jedes Element wird global als unmittelbares Kind des Knotens definiert und sein Typattribut kann auf einen der benannten komplexen Typen eingestellt werden.

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="TargetNamespace" xmlns:TN="TargetNamespace" xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="BookInformation" type="BookInformationType"/>
    <xs:complexType name="BookInformationType">
        <xs:sequence>
            <xs:element ref="Title"/>
            <xs:element ref="ISBN"/>
            <xs:element ref="Publisher"/>
            <xs:element ref="PeopleInvolved" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="PeopleInvolvedType">
        <xs:sequence>
            <xs:element name="Author"/>
        </xs:sequence>
    </xs:complexType>
    <xs:element name="Title"/>
    <xs:element name="ISBN"/>
    <xs:element name="Publisher"/>
    <xs:element name="PeopleInvolved" type="PeopleInvolvedType"/>
</xs:schema>
Der Vorteil dieses Ansatzes besteht darin, dass die Schemata wiederverwendbar sind. Da sowohl die Elemente als auch die Typen weltweit definiert sind, stehen beide zur Wiederverwendung zur Verfügung. Dieser Ansatz bietet die maximale Menge an wiederverwendbaren Inhalten. Die Nachteile sind das, dass das Schema ausführlich ist. Dies wäre ein angemessenes Design, wenn Sie allgemeine Bibliotheken erstellen, in denen Sie es sich leisten können, keine Annahmen über den Umfang der Schemaelemente und -typen und deren Verwendung in anderen Schemata zu treffen, insbesondere in Bezug auf Erweiterbarkeit und Modularität.


Da jeder eindeutige Typ und jedes Element eine einzelne globale Definition aufweist, können diese kanonischen Partikel/Komponenten eins zu eins mit Identifikatoren in einer Datenbank verwandt sein. Und während es auf den ersten Blick wie eine mühsame laufende manuelle Aufgabe erscheinen kann, um die Assoziationen zwischen den textuellen XSD -Partikeln/-komponenten und der Datenbank zu verwalten, kann SQL Server 2005 tatsächlich über die Anweisung kanonische Schema -Komponentenkenner generieren

CREATE XML SCHEMA COLLECTION

http://technet.microsoft.com/en-us/library/ms179457.aspx

Um umgekehrt ein Schema aus den kanonischen Partikeln zu konstruieren, bietet SQL Server 2005 die

SELECT xml_schema_namespace function

http://technet.microsoft.com/en-us/library/ms191170.aspx

Ca · Nicht · i · cal im Zusammenhang mit Mathematik. (einer Gleichung, Koordinate usw.) "In einfachster oder Standardform" http://dictionary.referenferate.com/browse/canonical

Andere, leichter zu konstruieren, aber weniger realisierbar/"denormalisiert/redundant" Schema -Muster umfassen

Der russische Puppenansatz http://blogs.msdn.com/skaufman/archive/2005/04/21/410486.aspx

Das Schema hat ein einziges globales Element - das Root -Element. Alle anderen Elemente und Typen sind zunehmend tiefer verschachtelt und geben ihm den Namen, da jeder Typ, der in die oben genannte ist, angeht. Da die Elemente in diesem Design lokal deklariert werden, werden sie nicht durch den Import oder Einbeziehung von Aussagen wiederverwendbar.

Der Salami -Slice -Ansatz http://blogs.msdn.com/skaufman/archive/2005/04/25/411809.aspx

Alle Elemente werden global definiert, aber die Typdefinitionen werden lokal definiert. Auf diese Weise können andere Schemata die Elemente wiederverwenden. Mit diesem Ansatz liefert ein globales Element mit seinem lokal definierten Typ eine vollständige Beschreibung des Inhalts der Elemente. Diese Informationen "Slice" werden individuell deklariert und dann wieder zusammengefasst und können auch zusammengesetzt werden, um andere Schemata zu konstruieren.

Der venezianische blinde Ansatz http://blogs.msdn.com/skaufman/archive/2005/04/29/413491.aspx

Ähnlich wie beim russischen Puppenansatz, der beide ein einziges globales Element verwenden. Der venezianische Blindansatz beschreibt einen modularen Ansatz, indem er alle Typdefinitionen weltweit benennt und definiert (im Gegensatz zu dem Salami -Slice -Ansatz, der Elemente global und lokal deklariert). Jeder global definierte Typ beschreibt einen einzelnen "Slat" und kann von anderen Komponenten wiederverwendet werden. Darüber hinaus können alle lokal deklarierten Elemente in Abhängigkeit von der ElementFormDefault -Attributeinstellung oben im Schema einen namespace qualifizierten oder namespace unqualifizierten (die Slats können "geöffnet" oder "geschlossen") sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top