Das neue zweite Format der START-Anweisung nur für XML-Dateien dient dem Positionieren auf einen oder mehrere Knoten (Elemente und/oder Attribute) aus dem XML-Dokument-Baum. Der Vergleich zur bisherigen START-Anweisung für Dateien zeigt für die einfachste Form nur folgende, kleinere Unterschiede:
Eine START-Anweisung kann gleichzeitig auf mehrere Schlüssel positionieren: auf das in der Anweisung angegebene Datenfeld und alle ihm untergeordneten.
Die KEY-Angabe entfällt. Da es sich bei einem XML-Dokument-Baum i.A. um ein zweidimensionales Gebilde handelt, ist die bei eindimensionalen Dateien mögliche Positionierung 'vor' bzw. 'nach' einem Schlüssel nicht sinnvoll auf XML-Dokumente (mit gleichzeitig mehreren Schlüsseln) übertragbar.
Analog zum XML-Format der READ-Anweisung ist die Art des Datenfeldes anzugeben, über das positioniert wird.
Eine neue START-Anweisung sieht kurz folgendermaßen aus:
START xml-file ELEMENT datenname-1
oder
START xml-file ATTRIBUTE datenname-1
Der Unterschied zwischen START-Anweisung und READ-Anweisung, die auch auf Knoten im Baum positioniert, besteht in der Festlegung des Wirkungsbereichs, ausgehend von dem in der Anweisung angegebenen Datenfeld.
Das in der START-Anweisung angegebene Datenfeld spielt dafür selbst keine Rolle. Im Unterschied zur READ-Anweisung muss diesem Datenfeld kein Knoten zugeordnet zu sein. Entscheidend ist, dass dem in der COBOL-Struktur direkt übergeordneten Datenfeld ein Knoten aus dem Baum zugeordnet sein muss. Der Wirkungsbereich der START-Anweisung umfasst dann den Teilbaum, der diesen Knoten als Wurzel hat.
Der Zuordnungsvorgang beginnt im ersten Schritt auf der COBOL-Seite mit dem in der START-Anweisung angegeben Datenfeld. Auf XML-Seite werden im Wirkungsbereich (wie oben definiert) alle Kinder des Wurzel-Knotens auf eine mögliche Zuordnung hin überprüft, in der Reihenfolge von den älteren zu den jüngeren (also werden im Unterschied zur READ-Anweisung, sofern datenname-1 eine gültige Position hat, auch dessen ältere Geschwister überprüft). Anschließend werden weitere Zuordnungen durchgeführt, wie unter "Zuordnungsvorgang" beschrieben. |
START modifiziert nur den EPV, lässt Daten aber unverändert.
Beispiel 12-51 Positionieren durch START
XML-Dokument |
Pos |
COBOL-Datenstruktur |
|
|
|
|
||
|
1 |
|
|
|
|
|
|
|
Anmerkungen:
Hinweise zur Darstellung dieses Beispiels finden Sie auf "Anweisungen für die XML-Verarbeitung".
Das in der START-Anweisung angegebene Datenfeld (y) muss keine gültige Position haben. Notwendig ist die gültige Position des direkt übergeordneten Datenfeldes (x mit Knoten 1).
Der Wirkungsbereich der START-Anweisung ist der Teilbaum mit Wurzel Knoten 1. Für die Zuordnung zu Datenfeld y werden die Kinder dieses Knotens (zuerst Knoten 2, dann Knoten 5) überprüft. Als erstes passt Knoten2 und die Zuordnung wird mit diesem Teilbaum fortgesetzt.
Da die START-Anweisung nur positioniert, aber keine Daten überträgt, werden durch die nachfolgende READ-Anweisung die Daten zu dem positionierten Knoten 2 und dem durch Knoten 2 bestimmten Teilbaum geliefert.
Beispiel 12-52 Wiederholtes Positionieren auf den gleichen Knoten (Fortsetzung von Beispiel 12-51)
XML-Dokument |
Pos |
COBOL-Datenstruktur |
|
|
|
|
1 |
|
|
|
|
Anmerkungen:
Hinweise zur Darstellung dieses Beispiels finden Sie auf "Anweisungen für die XML-Verarbeitung".
Das Lesen über Datenfeld y liefert das nächste Exemplar des Knotens mit Namen 'a'.
Für die folgende START-Anweisung über y spielen die Positionen der Datenfelder y und z keine Rolle, einzig die Position des dem y übergeordneten Datenfeldes x ist von Bedeutung.
Da sich die Position von Datenfeld x gegenüber der ersten START-Anweisung (siehe Beispiel 12-51) nicht geändert hat, ist der Wirkungsbereich noch der gleiche. Da auch die Werte der Schlüssel y-name und z-name unverändert sind, ergibt sich die gleiche Zuordnung, wie bei der ersten START-Anweisung.
Die START-Anweisung erlaubt es, erneut auf eines der bereits gelesenen älteren Geschwister zu positionieren (Knoten 2). Dies ist mit der READ-Anweisung nie möglich, dort wären nur jüngere Geschwister im Wirkungsbereich.
Die START-Anweisung überträgt keine Daten. Daher sind die Inhalte der zu y und z gehörenden Werte (y-wert, z-wert) unverändert, entsprechen aber nicht denen der durch die neue Positionierung zugeordneten Knoten (Knoten 2 und 3).
INDEX-Angabe bei START
START erlaubt zusätzlich nach dem datenname-1 noch die Angabe von
INDEX {bezeichner-1 | integer-1}
Der angegebene ganzzahlige positive Wert bestimmt, auf den wievielten Knoten von mehreren mit gleichem Elementnamen positioniert werden soll.
Die INDEX-Angabe ist auch für Attribut-Knoten erlaubt, obwohl Attributnamen eindeutig sein müssen. Wenn das i-te Attribut unabhängig vom Namen (d.h. IDENTIFIED USING) gelesen werden soll, macht die Index-Angabe für Attributnamen dennoch Sinn.
Beispiel 12-53 INDEX-Angabe bei START
XML-Dokument |
Pos |
COBOL-Datenstruktur |
|
|
|
|
|
|
1 |
|
|
|
|
|
|
|
00 |
00 |
23 |
00 |
Anmerkungen:
Hinweise zur Darstellung dieses Beispiels finden Sie auf "Anweisungen für die XML-Verarbeitung".
Der Wirkungsbereich der ersten START-Anweisung über z ist der Teilbaum mit Wurzel Knoten 2 (als der dem übergeordneten Datenfeld y zugeordnete Knoten).
Im ersten Schritt werden die Kinder von Knoten 2, d.h. Knoten 3, 4 und 7 auf eine mögliche Zuordnung überprüft. Da als Index 2 angegeben ist, wird nicht der erste passende Knoten (Knoten 4), sondern der zweite passende Knoten (Knoten 7) zugeordnet.
Der Index bezieht sich nur auf das in der START-Anweisung angegebene Datenfeld, nicht auf die Zuordnung von untergeordneten Datenfeldern (u). Von den 2 Exemplaren mit Namen 'e' wird das erste zugeordnet. Wenn für untergeordnete Datenfelder auch eine Index-Angabe wirken soll, ist für jedes eine entsprechende START-Anweisung erforderlich.
Der Zuordnungsvorgang für die zweite START-Anweisung betrachtet Knoten8 und 9 (als Kinder des dem z zugeordneten Knoten 7), findet also nicht so viele Knoten, wie verlangt (Index 3, aber nur 2 passende Knoten mit Namen 'e'). Es kann daher kein Knoten zugeordnet werden. Die Position des Datenfelds (u) wird auf ungültig gesetzt und eine Schlüsselfehler-Bedingung existiert.
Die dritte START-Anweisung hat als Wirkungsbereich das ganze Dokument. Positionierungen für untergeordnete Datenfelder (y, z, u), die bereits erfolgt sind, spielen keine Rolle.
Bei der dritten START-Anweisung kann dem Datenfeld (u) kein Knoten zugeordnet werden. Da u dem in der Anweisung angegebenen Datenfeld y untergeordnet ist, führt diese Situation nicht zu einer Schlüsselfehler-Bedingung.