Funktion
Ausgehend von einer bereits existierenden Zuordnung positioniert die READ-Anweisung auf Elemente bzw. Attribute aus dem XML-Dokument, ordnet sie den Datenfeldern in der FD zu und überträgt damit verbundene Werte.
Format
READ dateiname-1 {ATTRIBUTE | [ONLY] ELEMENT} datenname-1
[AT END unbedingte-anweisung-1]
[NOT AT END unbedingte-anweisung-2
]
[END-READ]
Syntaxregeln
dateiname-1 muss der Name einer XML-organisierten Datei sein.
datenname-1 darf gekennzeichnet sein.
datenname-1 muss mit einer IDENTIFIED-Klausel beschrieben und der Datei dateiname-1 untergeordnet sein.
Wenn in der READ-Anweisung ATTRIBUTE angegeben ist, muss die IDENTIFIED-Klausel in der Datenerklärung von datenname-1 die ATTRIBUTE-Angabe haben.
Wenn in der READ-Anweisung ELEMENT angegeben ist, muss die IDENTIFIED-Klausel in der Datenerklärung von datenname-1 explizit oder implizit die ELEMENT-Angabe haben.
Allgemeine Regeln
Wenn die Datei dateiname-1 nicht geöffnet ist, ist die READ-Anweisung nicht erfolgreich. Der Ein-/Ausgabe-Zustand der Datei wird auf 47 gesetzt.
Wenn in der Datei dateiname-1 kein XML-Dokument geöffnet ist, ist die READ-Anweisung nicht erfolgreich. Der Ein-/Ausgabe-Zustand der Datei wird auf 4D gesetzt.
Wenn datenname-1 keine gültige Position hat, ist die READ-Anweisung nicht erfolgreich. Der Ein-/Ausgabe-Zustand der Datei wird auf 46 gesetzt.
Die READ-Anweisung führt zuerst eine Zuordnung aus (siehe Abschnitt "Sprachelemente DATA DIVISION"), und überträgt anschließend ggf. Daten. Wenn im ersten Schritt dieses Zuordnungsvorgangs kein Knoten aus dem XML-Baum zugeordnet werden kann, ist die READ-Anweisung nicht erfolgreich. Der Ein-/Ausgabe-Zustand wird auf 10 gesetzt, d.h. eine Ende-Bedingung existiert.
Wenn die Namen in den bei der Zuordnung wirkenden IDENTIFIED-Klauseln nicht eindeutig sind (siehe "IDENTIFIED-Klausel", allgemeine Regel 9 auf "IDENTIFIED-Klausel"), ist die READ-Anweisung nicht erfolgreich. Der Ein-/Ausgabe-Zustand der Datei wird auf 4C gesetzt.
Wenn sich einzelne Attribut- bzw. Elementnamen aus den bei der Zuordnung wirkenden IDENTIFIED-Klauseln nicht im Zeichensatz UTF-16 darstellen lassen, ist die READ-Anweisung nicht erfolgreich. Der Ein-/Ausgabe-Zustand der Datei wird auf 4E gesetzt.
Bei der Zuordnung ist im ersten Schritt auf der COBOL-Seite nur das Datenfeld datenname-1 zu betrachten; dazu dann im XML-Baum folgende Knoten:
falls datenname-1 eine IDENTIFIED BY-Klausel mit der ATTRIBUTE-Angabe hat: der datenname-1 zugeordnete Knoten aus dem XML-Baum und alle seine Geschwister. Da in XML-Dokumenten Attribute eines Elements eindeutig sein müssen, spielt hier die Reihenfolge, in der diese Knoten zu betrachten sind, keine Rolle.
andernfalls:
wenn der Knoten durch eine READ-Anweisung zu datenname-1 zugeordnet wurde: alle jüngeren Geschwister dieses Knotens in der Reihenfolge vom ältesten jüngeren Geschwister bis zum jüngsten jüngeren Geschwister.
wenn der Knoten durch eine OPEN DOCUMENT- oder START-Anweisung zu datenname-1 zugeordnet wurde: dieser Knoten selbst und anschließend alle seine jüngeren Geschwister in der Reihenfolge vom ältesten jüngeren Geschwister bis zum jüngsten jüngeren Geschwister.
Wenn ONLY angegeben ist, sind für nachfolgende READ-Anweisungen die gemachten Zuordnungen für alle datenname-1 untergeordneten Datenfelder, die explizit oder im-plizit die ELEMENT-Angabe haben, so zu interpretieren, als ob sie durch eine START-Anweisung erfolgt wären (und nicht durch die READ-Anweisung).
Wenn es in dem Teilbaum des XML-Dokuments, dessen Wurzel derjenige Knoten ist, der datenname-1 zugeordnet wurde, auch Knoten gibt, die keinem Datenfeld aus dem COBOL-Programm zugeordnet werden konnten, und wenn ONLY nicht angegeben ist, ist die READ-Anweisung erfolgreich. Der Ein-/Ausgabe-Zustand wird auf 08 gesetzt.
Als Ergebnis der READ-Anweisung bleiben Datenfelder in den Satzbeschreibungen von dateiname-1 entweder unverändert oder werden initialisiert, oder die Anweisung überträgt Daten aus dem XML-Baum. Dies ist im Einzelfall abhängig von der aktuell durchgeführten Zuordnung und der Lage der Datenfelder in den Satzbeschreibungen relativ zu datenname-1:
Datenfelder
datenname-1 wurde ein Knoten zugeordnet
datenname-1 wurde kein Knoten zugeordnet
datenname-1
Übertragung
unverändert
Datenfeld ist datenname-1 untergeordnet; ein Knoten wurde zugeordnet.
Übertragung
—
Datenfeld ist datenname-1 untergeordnet; es wurde kein Knoten zugeordnet.
Initialisierung
unverändert
Andere Datenfelder
unverändert
unverändert
Wenn ONLY angegeben ist, beschränkt sich die Übertragung auf Daten zu datenname-1 und allen ihm direkt untergeordneten Datenfeldern, die in ihrer IDENTIFIED-Klausel die ATTRIBUTE-Angabe haben. Alle anderen Datenfelder bleiben unverändert.
Übertragung' bzw. 'Initialisierung' im Zusammenhang mit einem Datenfeld bedeutet die Zuweisung von Werten an folgende Datenfelder (sofern diese definiert sind):
Übertragung
Initialisierung
Datenfeld aus der USING-Angabe der IDENTIFIED-Klausel
Name des Knotens aus dem XML-Baum
Leerzeichen
Datenfeld aus der NAMESPACE USING-Angabe
Wert des Namensraums aus dem XML-Baum
Leerzeichen
Datenfeld für den Wert
Wert des Knotens aus dem XML-Baum
INITIALIZE datenfeld TO DEFAULT
Datenfeld aus der COUNT-Klausel
1
0
Daten aus dem XML-Baum werden für die Übertragung als XML-Wert aufgefasst und entsprechend behandelt (siehe "Datenübertragung bei strukturorientierter Verarbeitung").
Das Datenfeld für den Wert eines Knoten entspricht dem Datenfeld mit der IDENTIFIED-Klausel, sofern dieses elementar ist. Andernfalls muss es dem Datenfeld mit der IDENTIFIED-Klausel direkt untergeordnet sein und darf als einziges der direkt untergeordneten Datenfelder weder eine IDENTIFIED-Klausel haben, noch durch eine IDENTIFIED-Klausel angesprochen werden.
Mixed Content-Werte sind zu einem einzigen Wert zusammengefasst. Der Inhalt von CDATA-Abschnitten wird als Bestandteil der 'normalen Werte' geliefert.
Es werden auch Werte zu Attributen geliefert, die im XML-Dokument nicht angegeben sind, sofern diese in der DTD mit einem Vorgabewert versehen sind.
Die Fortsetzung des Ablaufs der READ-Anweisung hängt davon ab, ob AT END oder NOT AT END angegeben ist, siehe Abschnitt "Ende-Bedingung".