XML-Technologien
Posts 1-6 of 6
-
Dr. Robert PatzkeThe company name is only visible to registered members.Frage zur Verwendung von unique und key
Eigentlich glaubte ich das verstanden zu haben, die Beschreibung in XML-Schema zu unique und key adressiert genau mein Problem:
Ein Messgerät mit x Eingangskanälen wird als Klasse beschrieben (complexType), von der für jeden Kanal eine Instanz in einer XML-Datei (Konfigurationsdatei) gebildet wird.
Damit keine falschen Zuordnungen entstehen und dem Bediener des Konfigurationsprogrammes die konkrete Zuordnung physikalischer Eingänge bewusst wird, haben diese eindeutige Bezeichner, die im konkreten Gerät zur Laufzeit auch überprüft werden können.
Also werden diese eindeutigen Bezeichner in einer Liste aufgeführt und der Bediener hat bei der Zuordnung eines Kanals (Instanzbildung) die Entscheidung 1 aus x. Für den nächsten Kanal dann natürlich nur 1 aus (x-1) u.s.w.
Tja, das macht man mit unique und ggf. mit key.
Aber wie?
Ich habe einfach nicht verstanden, wo meine Liste der Bezeichner abzulegen ist.
Ich probiere weiter, aber vielleicht ist hier jemand, der sich damit auskennt und mir etwas auf die Sprünge helfen kann.
... Ich habe die Lösung gefunden, werde sie hier in ein paar Stunden erläutern, für alle die, deren Neugierde ich geweckt habe.
... Hier eine Lösung, die ich allerdings noch nicht validiert habe, das mache ich erst in den nächsten Tagen:
Festlegung der eindeutigen Eingangsbezeichner:
<xs:simpleType name="eingBez">
<xs:restriction base="xs:string">
<enumeration value="E1"/>
<enumeration value="E2"/>
<enumeration value="E3"/>
<enumeration value="E4"/>
</xs:restriction>
</xs:simpleTpe>
und nun ein Kanal spezifiziert (innerhalb einer komplexeren Gerätestruktur) mit einigen Elementen, unter anderem dem Element Eingang:
Gerätestruktur .....
<xs:element name="Kanal" maxOccurs="4">
<xs:complexType>
<xs:sequence>
<xs:element name="Eingang" type="eingBez"/>
<xs:element name="verstärkung" type="xs:float"/>
....
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:unique name="irgendWas">
<xs:selector xpath="Kanal"/>
<xs:field xpath="Eingang"/>
</xs:unique>
Gerätestruktur .....
Nach diesem Schema sollte die XML-Instanz für jedes Element Kanal einen anderen Wert im Sub-Element Eingang haben müssen, sonst Fehler.
This post was modified on 07 Jun 2006 at 04:22 pm.- 07 Jun 2006, 08:12 am
-
Rico ApfelbeckThe company name is only visible to registered members.Re: Frage zur Verwendung von unique und key
Neben der Verwendung eines abgeleiteten Datentyps wäre auch die Verwendung einer Referenz möglich.
In diesem Fall beinhaltet das XML-Dokument eine dynamische List der zulässigen Werte. Im Schema wird dann definiert, welches Attribut bzw. welche Attributkombination in dieser Liste den eindeutigen Schlüssel bildet (<xs:key name="pk_nationliste"><xs:selector xpath="..."/><xs:field xpath="@nation_id"/></xs:key>). Dieser kann von anderen Attributen aus referenziert werden (<xs:keyref name="fk_nationliste" refer="pk_nationliste"><xs:selector xpath="..."/><xs:field xpath="@nation_id"/></xs:keyref>).
MfG Rico
- 31 Jul 2006, 2:53 pm
-
Dr. Robert PatzkeThe company name is only visible to registered members.Vielen Dank ....
... für den Tip.
Das muss ich mir aber erst nochmal genauer ansehen, mit anderen Worten, ausprobieren.
Dennoch, es freut mich sehr, dass da noch jemand mit XML-Schema herumwerkelt.
Ich habe den Eindruck, dass viele den Umgang damit scheuen (weil es ihnen zu kompliziert erscheint) und stattdessen die in XML-Schema enthaltenen Spezifikationen über inhaltlich interpretierte XML-Tags immer wieder neu definieren.
Das geht los bei den Grunddatentypen und findet sich schliesslich in der n+1 ten Definition eines Grenzwertes durch den sinnigen XML-Tag <upperLimit> oder <lowerLimit> oder, oder, oder, ... .
Und schon entsteht wieder eine neue XML-Variante mit spezifischen Tags, die auch nicht mehr aussagen, als in XML-Schema bereits enthalten ist.
Es scheint im Trend zu liegen, XML-Tags beliebig für die eine oder andere Anwendung zu spezifizieren.
Ein neuer Turmbau zu Babel hat begonnen ....
Ich verwende jetzt seit ca. einem halben Jahr XML-Schema zur Beschreibung von Geräteklassen und ihren Eigenschaften und bin von den Möglichkeiten dieser "Sprache" immer wieder angenehm überrascht.
Das geht, zumindest für meinen Anwendungsbereich, deutlich über z.B. CORBA-IDL hinaus.
Mit freundlichen Grüßen,
Robert Patzke
- 16 Aug 2006, 6:26 pm
-
Post visible to registered members
-
Kasimier Thomas Buchcik Premium MemberThe company name is only visible to registered members.Re^2: Frage zur Verwendung von unique und key
Die Verwendung des Datentyps xs:ID in Kombination mit xs:enumeration Facetten könnte für Ihren Anwendungsfall völlig ausreichend sein.
Es sei jedoch darauf hingewiesen, daß die Werte für den gesamten zu validierenden Baumabschnitt eindeutig sein müssen; falls der Wert "E1" in irgend einem anderen Zusammenhang vom Datentyp xs:ID ist, oder mehrmals im Dokument vorkommen darf/soll, dann bekommen wir Konflikte.
Um solchen Konflikten auszuweichen wurden Indentity Contraints eingeführt: Binden der eindeutigen und erlaubten Werte an nur bestimmte Elemente in einem bestimmten Kontext.
Ich denke Rico Apfelbeck's Kommentar ist folgendermaßen zu verstehen:
(jedoch habe ich keine Ahnung inwiefern Editoren eine Eingabehilfe für solche
Definitionen bereitstellen; das Folgende wurde freihand geschrieben, somit keine
Garantie für Vollständigkeit/Fehlerfreiheit)
Ausgehend vom folgenden Szenario:
<Root>
<Kanal>
<Eingang>E1</Eingang>
</Kanal>
<Kanal>
<Eingang>E2</Eingang>
</Kanal>
<!-- Liste der erlaubten Kanal-Werte. -->
<Kanal-Liste>
<Wert>E1</Wert>
<Wert>E2</Wert>
</Kanal-Liste>
</Root>
Verknüpfe diese Liste der erlaubten Werte mit den Kanal-Instanzen
mit Hilfe von Identity Constraints:
<xs:element name="Root">
<xs:complexType>
<xs:sequence>
<xs:element ref="Gerät" maxOccurs="unbound"/>
<!-- Liste mit erlaubten Kanal-Werten. In diesem Fall ist die Liste
integriert; über XInclude könnte man sie jedoch in ein separates
Dokument auslagern. -->
<xs:element ref="Kanal-Liste"/>
</xs:sequence>
</xs:complexType>
<!-- Eindeutigkeit für Werte im Kontext der Liste. -->
<xs:unique name="Wert-Liste">
<xs:selector xpath="Kanal-Liste"/>
<xs:field xpaht="Wert"
</xs:unique>
<!-- Auf erlaubte Werte prüfen. -->
<xs:keyref name="Ref-Wert" refer="Wert-Liste">
<xs:selector xpath="Gerät/Kanal/Wert"/>
<xs:field xpath="."/>
</xs:keyref>
</xs:element>
<xs:element name="Gerät">
<xs:complexType>
<xs:sequence>
<xs:element name="Kanal" maxOccurs="4">
<xs:complexType>
<xs:sequence>
<xs:element name="Eingang" type="xs:string"/>
</xs:sequence>
<xs:complexType>
</xs:element>
</xs:sequence>
<xs:complexType>
<!-- Eindeutigkeit für jeden Eingang eines Kanals im Kontext eines Gerätes. -->
<xs:unique name="Unique-Wert">
<xs:selector xpath="."/>
<xs:field xpath="Kanal/Eingang"/>
</xs:unique>
</xs:element>
<xs:element name="Kanal-Liste">
<xs:complexType>
<xs:sequence>
<!-- Falls die erlaubten Werte im Schema definiert sein sollen, dann
mit xs:enumeration die möglichen String-Werte begrenzen. -->
<xs:element name="Wert" type="xs:string" maxOccurs="unbounded"/>
</xs:sequence>
<xs:complexType>
</xs:element>
This post was modified on 23 Aug 2006 at 07:25 pm.- 23 Aug 2006, 7:21 pm
-
Dr. Robert PatzkeThe company name is only visible to registered members.Vielen Dank den letzten Beiträgen
Das Problem ist vom Tisch (vorerst).
Die Anwendung von unique/key ist ausreichend und deren Zuordnung auf bestimmte Knoten für die Lösung meines Problems ideal.
Denn wenn ich mehrere Geräte derselben Art anschliesse, sind das weitere Instanzen derselben Geräteklasse und die eindeutige Zuordnung der Eingänge muss immer wieder für jedes weitere Gerät vorgenommen werden.
Deswegen kommt ID nicht in Frage, weil es die Eindeutigkeit insgesamt fordert. Und relevant ist auch, dass ich eine vergebene Zuordnung aus der Angebotsliste streichen muss, für das aktuell konfigurierte Gerät.
Ich habe mich über die Beiträge sehr gefreut.
Vielen Dank und weiterhin frohes Schaffen,
Robert Patzke
- 04 Sep 2006, 12:41 pm
