XML-Technologien

XML-Technologien

Posts 1-3 of 3
  • Dr. Robert Patzke
    Dr. Robert Patzke
    The company name is only visible to registered members.
    Wie geht #define/enum im Schema?
    Werte Gruppenmitglieder,

    ich bin sehr zufrieden mit den Möglichkeiten von XML Schema zur Beschreibung konkreter Ressourcen (Geräte und Software-Module).
    Aber an einer Stelle fehlt mir etwas und ich habe noch keinen geeigneten Weg gefunden:

    In der Umgebung der klassischen Programmiersprachen ist es selbstverständlich, konstante Größen (ggf. auch Makros) durch einen Namen zu beschreiben (#define, enum, etc.), der dann vom Compiler bei der Programmerstellung ersetzt wird.
    Der Vorteil ist, neben der einfachen globalen Referenz mit Einfluss auf alle Programmteile, dass man mit dem Wert einen erklärenden Bezeichner verbinden kann.
    Das wird gerade bei den Enumerationen deutlich, die mir eine Art Zuweisungsliste Name/Wert liefern.

    Ich habe dafür kein Äquivalent in XML-Schema gefunden.
    Kann mir jemand helfen?

    Beispiel:
    C:
    enum FARBE
    {
    rot,
    gelb,
    blau
    };

    Damit wird dem Bezeichner "rot" der Wert 0 zugewiesen, etc.

    Zwar kann ich im Schema ebenfalls eine Enumeration ausführen, doch ich muss mich zwischen Namen und Werten entscheiden und den Basistypen entsprechend wählen.

    Auch die "Entity"-Möglichkeit durch Elemente mit fixed-value hilft mir nicht, weil diese erst in der Instanz relevant wird und mir nicht bei der Ressourcenbeschreibung hilft.
    Zumindest habe ich keine Möglichkeit gefunden, wie ich im Schema darstelle, dass die Entity genau an dieser Stelle in der Instanz sitzt, also z.B. den Inhalt eines bestimmten Elementes darstellt.

    Und der Weg, für die einfache Auswahl von Werten gleich Elemente (über choice) zu definieren und darüber die Zuordnung von Name und Wert (fixed) zu gewinnen, erscheint mir überzogen.
    Das sieht in der XML-Instanz auch sehr überladen aus.

    Hat jemand eine Idee?

    Mit freundlichen Grüßen,
    Robert Patzke
    This post was modified on 06 Feb 2007 at 10:15 am.
  • Pascal Serwe
    Pascal Serwe
    The company name is only visible to registered members.
    Re: Wie geht #define/enum im Schema?
    Hallo,

    ich kann mir gerade nicht vorstellen wozu das Mapping von String zu Int innerhalb eines Schamas notwendig sein sollte. Wenn es nur darum geht, sowohl int als auch String als Wert für ein Element zuzulassen, dann ginge das über ein 'union':

    <xsd:simpleType name="farbbezeichner">
    <xsd:restriction base="xsd:string">
    <xsd:enumeration value="Rot"/>
    <xsd:enumeration value="Grün"/>
    <xsd:enumeration value="Blau"/>
    </xsd:restriction>
    </xsd:simpleType>

    <xsd:simpleType name="farbwert">
    <xsd:restriction base="xsd:int">
    <xsd:enumeration value="0"/>
    <xsd:enumeration value="1"/>
    <xsd:enumeration value="2"/>
    </xsd:restriction>
    </xsd:simpleType>

    <xsd:simpleType name="farbe">
    <xsd:union memberTypes="xing:farbwert xing:farbbezeichner"/>
    </xsd:simpleType>

    Mit diesem Schama ist sowohl

    <farbe>Rot<farbe>

    also auch

    <farbe>0</farbe>

    gültig.

    Die Abbildung der Äquivalenz dieser beiden Elemente kann dann in der Programmlogik vollzogen werden, soweit ich weiß aber nicht im Schema. Wie gesagt fällt mir dafür auch kein Grund ein.


    Gruß,
    Pascal Serwe
    This post was modified on 06 Feb 2007 at 02:25 pm.
  • Dr. Robert Patzke
    Dr. Robert Patzke
    The company name is only visible to registered members.
    Re^2: Wie geht #define/enum im Schema?
    Vielen Dank für die schnelle Antwort.

    Der Grund ist derselbe, warum es in C++ die #define-Anweisung oder enum gibt (oder die const-Anweisung mit Wertzuweisung).
    Es geht ganz einfach um die Gestaltung des Schema-"Programms", also die Zuordnung von Zahlenwerten aus Listen, wofür eine mnemonische Hilfe angebracht ist.
    Wenn man Ressourceneigenschaften über ein Schema beschreibt (vergleiche Klasse in C++ oder Java), dann möchte man manche Eigenschaften vorgeben, nicht nur strukturell sondern auch inhaltlich. Und da sind Zahlen häufig, die dann durch Bezeichner "erinnerbar" gehalten werden.

    Beispiel:
    Über eine XML-Instanz wird ein am PC angeschlossenes Gerät konfiguriert. Das Gerät hat eine Anzeige, deren Hintergrundfarbe ich einstellen kann, wählbar mit 1 aus 8 Farben.
    Dafür erwartet das Gerät eine Zahl von 1 bis 8.
    In der XML-Instanz steht drin, für welche Farbe ich mich entschieden habe, also eine Zahl von 1 bis 8.
    Im XML-Schema gebe ich den entsprechenden Datentyp über die Restriktion einer Integer mit <enumeration> an, lege also die möglichen Werte fest.
    Die Erstellung der XML-Instanzdatei, also die konkrete Konfiguration des Gerätes, will ich mit einem Werkzeug vornehmen, das universell arbeitet.
    Wenn ich also jetzt in der Eingabemaske das Element <Hintergrundfarbe> bedienen will, muss darin eine Zahl von 1 bis 8 landen. Das Schema hilft, dass ich hier nichts Falsches eingebe.
    Woher weiß ich in diesem Moment aber, dass "Rot" durch die Zahl 5 dargestellt werden muss?
    Genau das würde ich auch gerne im Schema darstellen, denn es ist ja eine Eigenschaft des Gerätes, dass es auf die Zahl 5 im Element <Hintergrundfarbe> mit einem roten Hintergrund im Display reagiert.

    Die <union> ist da eine Lösung, wenn ich zusätzliche Vorgaben für die Zuordnung mache. Also z.B. "nimm den Text für die Auswahl am Bildschirm und setze im Element den auf derselben Enumerationsebene angegebenen Wert ein".
    Genauso könnte ich auch eine zusätzlich Vorgabe machen, indem ich sage: Nummeriere die Enumerationen in XML-Schema automatisch durch und setze statt der Texte im XML-Element die Nummer ein.

    Aber genau deshalb nutze ich XML-Schema, weil ich damit sehr umfangreich die Eigenschaften von Geräten beschreiben kann, ohne selbst zusätzliche Vorgaben zu machen.
    Also ich möchte keinen eigenen "XML-Dialekt" schreiben, indem ich z.B. die Elementnamen als "Tags" interpretiere und eine eigene Spezifikation für deren Bedeutung erstelle.

    Ansonsten scheint mir die Lösung über die <union> mit nachgelegter <enumaration> die bislang vielversprechendste zu sein, da ich auch beliebige Zahlen mit Texten kombinieren kann und die Anweisung für die Behandlung bei der Erstellung der Instanz eindeutig darstellbar ist.
    Also nochmals vielen Dank.

    Freundliche Grüße,
    Robert Patzke
    This post was modified on 06 Feb 2007 at 03:42 pm.