1:1 Relation in XSD darstellen

codemagic

Mitglied
Schönen guten Tag,

wie kann ich eine 1:1 Relation in einer XML Schema Definition darstellen? Ich hab leider nur wenige Beispiele gefunden die aber nicht so ganz verstanden...

Daher habe ich mal selbst ein Beispiel genommen, wäre voll nett wenn es jemand ergänzen könnte.

Ich hoffe es ist selbsterklärend bzw gut dokumentiert ;)

tia;(

[XML]<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xsd:documentation>
(c) Marcel Flaig - codemagic.net
This ement is a complexType which consist of a short abreviation and a long name for each unit.
longname starts with a capital letter, shortname doesn't.
</xsd:documentation>

<!-- complexType Unit -->
<xs:element name="Unit">
<xs:complexType>
<xs:sequence>
<xs:element name = "Unit_shortname" type = "unit_shortname" />
<xs:element name = "Unit_longname" type = "unit_longname" />
</xs:sequence>
</xs:complexType>
</xs:element>

<!-- unit shortname -->
<xs:simpleType name="unit_shortname">
<xs:restriction base="xs:string">
<xs:enumeration value="ml"/>
<xs:enumeration value="l"/>
<xs:enumeration value="pcs"/>
<xs:enumeration value="g"/>
<xs:enumeration value="kg"/>
</xs:restriction>
</xs:simpleType>

<!-- unit longname -->
<xs:simpleType name="unit_shortname">
<xs:restriction base="xs:string">
<xs:enumeration value="MilliLiter"/>
<xs:enumeration value="Liter"/>
<xs:enumeration value="Pieces"/>
<xs:enumeration value="Gramm"/>
<xs:enumeration value="Kilo-Gramm"/>
</xs:restriction>
</xs:simpleType>
[/XML]

Also das hier z.B. hatte ich gelesen: XML - Managing Data Exchange/The one-to-one relationship - Wikibooks, open books for an open world

Was mir halt absolut nicht klar ist wo die Schlüssel sind... also primary key und foreign key
 
Zuletzt bearbeitet:

Barista

Top Contributor
In der Zeile 32 müsste es wahrscheinlich Unit_longname heissen.

Aber das löst nicht dein Problem.

Warum musst Du überhaupt Unit_shortname und Unit_longname im XML speichern,
das ist doch eine redundante Information?

Wenn Du das unbedingt willst, dann packe doch Unit_shortname und Unit_longname in einen Typ.

Ach so, hast Du schon Unit.

Den Typ Unit machst Du abstrakt.

Davon leitest Du für jede Paarung einen finalen Typ ab,
der dann verwendet werden muss.
 
Zuletzt bearbeitet:

codemagic

Mitglied
Hi,

erstmal Danke für deine Antwort,
in Zeile 32 ist absichtlich groß bzw klein geschrieben da ich so Element und Typ unterscheide,
müsste also imho richtig so sein.

Leider schein ich es immernoch nicht geblickt zu haben, abstract=true und final extension ?!
Müsste man hier nicht 2 HilfsKeys "ID" einfügen? (key /keyref) ich glaub ich versteh das Konzept noch nicht so ganz...

Kannst du mein Beispiel evtl. anpassen?
 
Zuletzt bearbeitet:

Barista

Top Contributor
Ich habe es mal so probiert, geht aber nicht:

[XML]<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<!-- complexType Unit -->
<xs:complexType name="abstractUnit" abstract="true">
<!--xs:sequence>
<xs:element name="Unit_shortname" type="xs:string" />
<xs:element name="Unit_longname" type="xs:string" />
</xs:sequence-->
</xs:complexType>

<xs:complexType name="mlUnit">
<xs:complexContent>
<xs:extension base="abstractUnit">
<xs:sequence>
<xs:element name="Unit_shortname" fixed="ml" />
<xs:element name="Unit_longname" fixed="MilliLiter" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>

<xs:complexType name="lUnit">
<xs:complexContent>
<xs:extension base="abstractUnit">
<xs:sequence>
<xs:element name="Unit_shortname" fixed="l" />
<xs:element name="Unit_longname" fixed="Liter" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>

<xs:complexType name="pcsUnit">
<xs:complexContent>
<xs:extension base="abstractUnit">
<xs:sequence>
<xs:element name="Unit_shortname" fixed="pcs" />
<xs:element name="Unit_longname" fixed="Pieces" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>

<xs:complexType name="gUnit">
<xs:complexContent>
<xs:extension base="abstractUnit">
<xs:sequence>
<xs:element name="Unit_shortname" fixed="g" />
<xs:element name="Unit_longname" fixed="Gramm" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>

<xs:complexType name="kgUnit">
<xs:complexContent>
<xs:extension base="abstractUnit">
<xs:sequence>
<xs:element name="Unit_shortname" fixed="kg" />
<xs:element name="Unit_longname" fixed="Kilo-Gramm" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>

</xs:schema>
[/XML]
 

Barista

Top Contributor
Ich habe mal ein Buch rausgekramt und zwei Lösungen gemacht.

Hier die Lösung mit choice:

Datei codemagic_choice.xsd
[XML]<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="Units">
<xs:complexType>
<xs:sequence>
<xs:element name="Unit" type="Unit" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>

<xs:complexType name="Unit">
<xs:choice>
<xs:element name="mlUnit" type="mlUnit" />
<xs:element name="lUnit" type="lUnit" />
<xs:element name="pcsUnit" type="pcsUnit" />
<xs:element name="gUnit" type="gUnit" />
<xs:element name="kgUnit" type="kgUnit" />
</xs:choice>
</xs:complexType>

<!-- complexType Unit -->
<xs:complexType name="mlUnit">
<xs:sequence>
<xs:element name="Unit_shortname" fixed="ml" />
<xs:element name="Unit_longname" fixed="MilliLiter" />
</xs:sequence>
</xs:complexType>

<xs:complexType name="lUnit">
<xs:sequence>
<xs:element name="Unit_shortname" fixed="l" />
<xs:element name="Unit_longname" fixed="Liter" />
</xs:sequence>
</xs:complexType>

<xs:complexType name="pcsUnit">
<xs:sequence>
<xs:element name="Unit_shortname" fixed="pcs" />
<xs:element name="Unit_longname" fixed="Pieces" />
</xs:sequence>
</xs:complexType>

<xs:complexType name="gUnit">
<xs:sequence>
<xs:element name="Unit_shortname" fixed="g" />
<xs:element name="Unit_longname" fixed="Gramm" />
</xs:sequence>
</xs:complexType>

<xs:complexType name="kgUnit">
<xs:sequence>
<xs:element name="Unit_shortname" fixed="kg" />
<xs:element name="Unit_longname" fixed="Kilo-Gramm" />
</xs:sequence>
</xs:complexType>

</xs:schema>
[/XML]

Datei codemagic_choice.xml
[XML]<?xml version="1.0" encoding="UTF-8"?>
<Units
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="codemagic_choice.xsd">
<Unit>
<mlUnit>
<Unit_shortname>ml</Unit_shortname>
<Unit_longname>MilliLiter</Unit_longname>
</mlUnit>
</Unit>
<Unit>
<lUnit>
<Unit_shortname>l</Unit_shortname>
<Unit_longname>Liter</Unit_longname>
</lUnit>
</Unit>
<Unit>
<pcsUnit>
<Unit_shortname>pcs</Unit_shortname>
<Unit_longname>Pieces</Unit_longname>
</pcsUnit>
</Unit>
<Unit>
<gUnit>
<Unit_shortname>g</Unit_shortname>
<Unit_longname>Gramm</Unit_longname>
</gUnit>
</Unit>
<Unit>
<kgUnit>
<Unit_shortname>kg</Unit_shortname>
<Unit_longname>Kilo-Gramm</Unit_longname>
</kgUnit>
</Unit>
</Units>
[/XML]
 

Barista

Top Contributor
Hier die Lösung mit extension:

Datei codemagic_extension.xsd
[XML]<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="Units">
<xs:complexType>
<xs:sequence>
<xs:element name="Unit" type="abstractUnit" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>

<!-- complexType Unit -->
<xs:complexType name="abstractUnit" abstract="true">
</xs:complexType>

<xs:complexType name="mlUnit">
<xs:complexContent>
<xs:extension base="abstractUnit">
<xs:sequence>
<xs:element name="Unit_shortname" fixed="ml" />
<xs:element name="Unit_longname" fixed="MilliLiter" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>

<xs:complexType name="lUnit">
<xs:complexContent>
<xs:extension base="abstractUnit">
<xs:sequence>
<xs:element name="Unit_shortname" fixed="l" />
<xs:element name="Unit_longname" fixed="Liter" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>

<xs:complexType name="pcsUnit">
<xs:complexContent>
<xs:extension base="abstractUnit">
<xs:sequence>
<xs:element name="Unit_shortname" fixed="pcs" />
<xs:element name="Unit_longname" fixed="Pieces" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>

<xs:complexType name="gUnit">
<xs:complexContent>
<xs:extension base="abstractUnit">
<xs:sequence>
<xs:element name="Unit_shortname" fixed="g" />
<xs:element name="Unit_longname" fixed="Gramm" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>

<xs:complexType name="kgUnit">
<xs:complexContent>
<xs:extension base="abstractUnit">
<xs:sequence>
<xs:element name="Unit_shortname" fixed="kg" />
<xs:element name="Unit_longname" fixed="Kilo-Gramm" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>

</xs:schema>
[/XML]

Datei codemagic_extension.xml
[XML]<?xml version="1.0" encoding="UTF-8"?>
<Units
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="codemagic_extension.xsd">
<Unit xsi:type="mlUnit">
<Unit_shortname>ml</Unit_shortname>
<Unit_longname>MilliLiter</Unit_longname>
</Unit>
<Unit xsi:type="lUnit">
<Unit_shortname>l</Unit_shortname>
<Unit_longname>Liter</Unit_longname>
</Unit>
<Unit xsi:type="pcsUnit">
<Unit_shortname>pcs</Unit_shortname>
<Unit_longname>Pieces</Unit_longname>
</Unit>
<Unit xsi:type="gUnit">
<Unit_shortname>g</Unit_shortname>
<Unit_longname>Gramm</Unit_longname>
</Unit>
<Unit xsi:type="kgUnit">
<Unit_shortname>kg</Unit_shortname>
<Unit_longname>Kilo-Gramm</Unit_longname>
</Unit>
</Units>
[/XML]
 

Ähnliche Java Themen

Neue Themen


Oben