Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

COBOL-Sprachmittel zur Beschreibung eines XML-Dokuments

&pagelevel(5)&pagelevel

Das in COBOL bereits vorhandene Stufenkonzept für die Strukturierung von Datensätzen wird verwendet, um die hierarchische Struktur eines XML-Dokuments darzustellen.

Der Übersichtlichkeit halber werden die neuen COBOL-Sprachmittel im ersten Schritt ohne Berücksichtigung von Namensräumen vorgestellt. Die Besonderheiten bei der Beschreibung und Verarbeitung von Namensräumen entnehmen Sie Abschnitt "Namensraum (namespace)".

Einem Knoten aus dem Baum entspricht ein Datenfeld in der COBOL-Datenstruktur. in der COBOL-Struktur darf es zusätzlich weitere Datenfelder geben, denen im Baum kein Knoten entspricht.

  • Das einer Wurzel entsprechende Datenfeld hat Stufennummer 01.

  • Die Datenfelder für Kinder eines Knoten haben alle die gleiche Stufennummer, die größer ist als die ihres Vaters.

  • Die neue IDENTIFIED-Klausel kennzeichnet in der COBOL-Struktur diejenigen Datenfelder, denen im Baum ein Knoten entspricht, und gibt die Art des Knotens, Element bzw. Attribut, an.

  • Die IDENTIFIED-Klausel dient gleichzeitig dazu, den Namen eines Elements bzw. Attributs anzugeben, wie er im XML-Dokument in den Tags steht. Klein- bzw. Großschreibung ist dabei relevant.

  • Das Datenfeld, das den Wert eines Elements bzw. Attributs aufnehmen soll, wird in der Struktur dem Datenfeld mit der IDENTIFIED-Klausel für das Element bzw. Attribut direkt untergeordnet. Wenn dieses Datenfeld das einzige einer IDENTIFIED-Klausel untergeordnete Datenfeld ist, darf es entfallen, und die PICTURE-Klausel für den Wert kann direkt zusammen mit der IDENTIFIED-Klausel angegeben werden.

  • Wenn für ein Datenfeld eine IDENTIFIED-Klausel angegeben ist, müssen auch alle in der Struktur übergeordneten Datengruppen eine IDENTIFIED-Klausel haben. Das bedeutet, dass die hierarchische Struktur des Baums lückenlos mit der COBOL-Struktur wiedergegeben werden muss. Zusätzliche Zwischenebenen auf der COBOL-Seite – selbst wenn sie nur einer besseren Strukturierung dienen sollen – sind nicht erlaubt.

Beispiel 12-33 COBOL-Beschreibung des gesamten XML-Dokuments

XML-Dokument

<a
   att="123">

   xxxx
   <B>zz

      <c>9876</c>

   </B>
</a>

COBOL-Datenstruktur

01 wurzel             IDENTIFIED BY "a" ELEMENT.
   02 wurzel-att      IDENTIFIED BY "att" ATTRIBUTE. 
      03 att-wert     PIC 999.
   02 wurzel-wert     IX X(10).
   02 kind            IDENTIFIED BY "B".
   03 kind-wert       PIC X.
      03 enkel        IDENTIFIED BY "c" ELEMENT
                      PIC 9(8) BINARY.

Anmerkungen:

  • Das Datenfeld enkel ist nicht weiter unterstrukturiert und kann daher gleichzeitig neben der Angabe des Elementnamens (’c’) auch zur Aufnahme des Wertes verwendet werden.-

  • Die Werte aus dem XML-Dokument werden entsprechend der COBOL-Beschreibung zur Verfügung gestellt:

    • numerische Werte am Dezimalpunkt ausgerichtet, ggf. konvertiert (z.B. Datenfeld enkel)

    • alphanumerische Werte ggf. abgeschnitten (z.B. Datenfeld kind-wert) bzw. mit Leerzeichen aufgefüllt (z.B. Datenfeld wurzel-wert)

  • Es ist nicht notwendig, dass für den Wert eines Knoten auch ein Datenfeld in der COBOL-Datenstruktur definiert wird, z.B. wenn der Knoten im Baum nie einen Wert hat, oder das Programm den Wert nicht verarbeiten will.

  • Die Ende-Tags aus dem XML-Dokument tauchen in der COBOL-Darstellung nicht auf. Sie sind implizit in der hierarchischen Struktur enthalten.

  • ELEMENT als Art eines Knotens ist der Defaultwert und darf daher in der IDENTIFIED-Klausel auch weggelassen werden (z.B. bei der Datengruppe kind).

  • Die COBOL-Beschreibung enthält auch Datenfelder, die keinem Knoten im Baum entsprechen (z.B. att-wert, wurzel-wert und kind-wert).

  • Verwechseln Sie nicht das in der IDENTIFIED-Klausel angegebene Literal mit dem Initialwert des Datenfeldes. Dieser wird nur durch eine VALUE-Klausel angegeben.

Angabe eines Element- bzw. Attribut-Namens in der IDENTIFIED-Klausel

Für die Angabe des Namens eines Elements bzw. Attributs in der IDENTIFIED-Klausel gibt es mehrere Möglichkeiten, siehe nachfolgende Liste.

Die Besonderheiten von namespaces, die auch Bestandteil des Namens sind, werden der Übersichtlichkeit halber im Abschnitt "Namensraum (namespace)" zusammenfassend dargestellt.

  • Sie haben den Namen vorgegeben mittels IDENTIFIED BY

    • konstant, als Literal

    • variabel, als Namen eines Datenfeldes, das den aktuellen Element- bzw. Attributnamen enthält

  • Der Name ist nicht vorgegeben; statt dessen wird der im Dokument gefundene Name zurückgegeben mittels IDENTIFIED USING.
    Dies kann man auch als eine besondere Form von 'vorgegeben' ansehen, bei der nicht exakt ein einziger Name, sondern alle möglichen Namen vorgegeben sind, also eine Art Wild Card-Notation.

  • Die in einer IDENTIFIED-Klausel angegebenen Datenfelder für die Element- bzw. Attributnamen dürfen 'fast überall' im Programm definiert sein. Wenn ihre Datenerklärung jedoch in einer Datenstruktur für ein XML-Dokument steht, muss diese Datenerklärung der IDENTIFIED-Klausel, die sie referenziert, direkt untergeordnet sein.

  • Die Verwendung von BY bzw. USING in Datenstrukturen unterliegt folgenden Einschränkungen:

    • Wenn einem Datenfeld mehrere Datenfelder mit ELEMENT-Angabe in der IDENTIFIED-Klausel direkt untergeordnet sind, müssen diese alle die BY-Angabe machen.

    • Wenn einem Datenfeld mehrere Datenfelder mit ATTRIBUTE-Angabe in der IDENTIFIED-Klausel direkt untergeordnet sind, müssen diese alle die BY-Angabe machen.

    • Wenn einem Datenfeld nur ein Datenfeld mit ELEMENT-Angabe in der IDENTIFIED-Klausel direkt untergeordnet ist, darf es entweder die BY- oder die USING-Angabe machen.

    • Wenn einem Datenfeld nur ein Datenfeld mit ATTRIBUTE-Angabe in der IDENTIFIED-Klausel direkt untergeordnet ist, darf es entweder die BY- oder die USING-Angabe machen.

Beispiel 12-34 Gleiche Beschreibung für unterschiedliche Dokumente

XML-Dokument 1

XML-Dokument 2

<a
   att="123">
   xxxx
   <b>zz
      <c>9876</c>
   </b>
</a>
<a_2
  att="345">
   abc
   <b>@#!??*
      <d>100</d>
   </b>
</a_2>

COBOL-Datenstruktur

01 wurzel                IDENTIFIED BY wurzel-name. 
   02 wurzel-name        PIC XXXX VALUE "a".
   02 wurzel-att         IDENTIFIED BY "att" ATTRIBUTE.
      03 att-wert        PIC 999.
   02 wurzel-wert        PIC X(10).
   02 kind               IDENTIFIED BY "b".
      03 kind-wert       PIC X.  
      03 enkel           IDENTIFIED USING enkel-name.
         04 enkel-wert   PIC 9(8) BINARY.
         04 enkel-name   PIC X.

Anmerkungen:

  • Die Indirektion in der IDENTIFIED-Klausel bei der Datengruppe wurzel, statt des Literals "a" ein Datenfeld anzugeben, das den Wert "a" hat, erlaubt es, mit der gleichen COBOL-Datenstruktur gleich aufgebaute XML-Dokumente zu verarbeiten, bei denen sich der Name des Wurzelelements unterscheidet. Für XML-Dokument 2, beispielsweise, wäre das Datenelement wurzel-name mit "a_2" zu versorgen.

  • Die Angabe IDENTIFIED USING beim Datenfeld enkel bedeutet keine Vorgabe für den Elementnamen, d.h. beliebige Namen passen dazu (z.B. das ’c’ aus XML-Dokument 1 bzw. das ’d’ aus XML-Dokument 2) und werden im Datenelement enkel-name zurückgeliefert.

  • Die Reihenfolge der Datenfelder für Name und Wert in der Struktur ist beliebig (z.B. wäre auch wurzel-wert vor wurzel-name bzw. enkel-name vor enkel-wert möglich).

Umfang der COBOL-Beschreibung

Das XML-Dokument kann und muss nicht komplett eins zu eins in COBOL wiedergegeben werden.

Es reicht, wenn das COBOL-Programm nur diejenigen Teile des XML-Dokuments beschreibt, die es auch verarbeiten will. Dabei ist jedoch eine Anforderung zu erfüllen: zu jedem Knoten aus dem XML-Dokument, der im COBOL Programm beschrieben ist, muss auch dessen Vater im COBOL-Programm beschrieben sein. Die Wurzel des XML-Dokuments muss also immer im COBOL-Programm beschrieben sein.

Die COBOL-Datenstruktur darf sowohl mehr Knoten beschreiben, als im XML-Dokument aktuell vorhanden sind, als auch weniger Knoten.

Knoten aus dem XML-Dokument können in der COBOL-Beschreibung aus folgenden zwei Gründen entfallen:

  • Untergeordnete Knoten müssen in der COBOL-Struktur nicht beschrieben werden, wenn die Anwendung einen Knoten – und damit auch alle Knoten in dem Teilbaum, dessen Wurzel der Knoten darstellt – nicht verarbeiten will.

  • Wiederholungen von Knoten mit gleichem Namen in einer Folge von Element-Knoten dürfen in der COBOL-Struktur nicht beschrieben werden. Dies kann bei Attributen nicht vorkommen, da sie relativ zu ihrem Element eindeutige Namen haben müssen.

    Analogie zu nicht XML-organisierten Dateien: In deren Dateierklärung (FD) hat nicht jeder einzelne Satz aus der Datei seine eigene Beschreibung, sondern nur die unterschiedlichen Satzstrukturen sind in der FD beschrieben. Analog spielen Wiederholungen von Elementen mit gleichem Namen im XML-Dokument für die Beschreibung in COBOL keine Rolle – eine einzige Beschreibung des Elements reicht aus. Analog zur READ-Anweisung, die weitere Sätze liefert, wobei der Zugriff immer über die gleiche Satzbeschreibung erfolgt, liefern die XML-spezifischen Anweisungen auch die Wiederholungen von Elementen, und der Zugriff erfolgt ebenfalls immer nur über die eine Beschreibung des Elements in der COBOL-Struktur.

Beispiel 12-35 Teilweise Beschreibung eines XML-Dokuments

XML-Dokument

<a>xxx
   <b>yyy</b>
   <d>123</d>
   <b>zz
      <c>9876</c>
   </b>
 </a>

COBOL-Datenstruktur 1

01 a             IDENTIFIED BY "a". 
   02 a-w        PIC X(10). 
   02 b          IDENTIFIED BY "b". 
      03         b-w PIC X(10). 
      03 c       IDENTIFIED BY "c". 
         04 c-w  PIC X(10).

COBOL-Datenstruktur 2

01 a           IDENTIFIED BY "a". 
   02 a-w      PIC X(10). 
   02 b        IDENTIFIED BY "b". 
      03       b-w PIC X(10). 
   02 d        IDENTIFIED BY "d". 
      03 d-w   PIC X(10).

Anmerkungen:

  • COBOL-Datenstruktur 1 erlaubt die Verarbeitung der Wurzel des XML-Dokuments und darunter nur die Teilbäume, deren Wurzel den Namen ’b’ hat – nicht aber den Teilbaum mit Wurzel ’d’.

  • Bei der Verarbeitung des XML-Dokuments mit der COBOL-Datenstruktur 1 hat der erste b-Knoten im Dokument keine Kinder, in der COBOL-Struktur ist dafür aber ein Kind beschrieben. Was dies im Detail bedeutet, entnehmen Sie dem Beispiel "Prinzip der Zuordnung von Knoten".

  • COBOL-Datenstruktur 2 erlaubt die Verarbeitung der Wurzel des XML-Dokuments und deren Kinder (’b’ und ’d’), aber nicht die Verarbeitung weiterer, ihnen untergeordneter Knoten (’c’).

  • Bei der Verarbeitung des XML-Dokuments mit der COBOL-Datenstruktur2 hat der zweite b-Knoten im Dokument Kinder, in der COBOL-Struktur ist dafür aber kein Kind beschrieben. Was dies im Detail bedeutet, entnehmen Sie dem Beispiel "Sequenzielles Lesen" in Kapitel "READ".

COUNT-Klausel

Wenn in der COBOL-Struktur Knoten beschrieben sind, die aktuell im Baum nicht existieren, kann es für die weitere Verarbeitung wichtig sein, zu wissen um welche Datenfelder der Struktur es sich dabei handelt.

Diesem Zweck dient die COUNT-Klausel: Sie legt ein ganzzahliges numerisches Datenelement fest, dessen Inhalt nur die Werte 0 oder 1 annehmen kann.

  • Der Wert 1 zeigt an, dass beim Lesen des XML-Dokuments ein Knoten aus dem Baum der Beschreibung in der COBOL-Struktur zugeordnet werden konnte, siehe auch "Zuordnungsvorgang".

  • Der Wert 0 zeigt an, dass kein entsprechender Knoten im Baum existiert.

Beispiel 12-36 COUNT-Angabe

...
 08 x-knoten   IDENTIFIED BY "x"  COUNT IN x-anzahl.
   09 x-wert   PIC 9(8).
...

Anmerkungen:

  • Sie dürfen den Namen 'x-anzahl' des Datenelements frei wählen. Der Name muss jedoch ohne Qualifizierung im gesamten Programm eindeutig sein. Das Datenfeld mit diesem Namen dürfen Sie jedoch nicht selbst definieren.

  • Die Definition erfolgt implizit durch die Angabe des Datennamens in der COUNT-Klausel.

  • Die COUNT-KLausel darf nur für Datenfelder angegeben werden, die auch eine IDENTIFIED-Klausel haben.

  • Das COUNT-Datenelement gibt nicht die Anzahl der Wiederholungen von Knoten mit dem Namen 'x' im Baum an.

  • Das COUNT-Datenelement hat nichts mit dem Wert eines Knoten zu tun.