XML-Formulare

Copyright

Dieses Dokument unterliegt dem Copyright © 2018. Die Beitragenden sind unten aufgeführt. Sie dürfen dieses Dokument unter den Bedingungen der GNU General Public License (http://www.­gnu.org/licenses/gpl.html), Version 3 oder höher, oder der Creative Commons Attribution License (http://creativecommons.org/licenses/by/3.0/), Version 3.0 oder höher, verändern und/oder weitergeben.

Warennamen werden ohne Gewährleistung der freien Verwendbarkeit benutzt.

Fast alle Hardware- und Softwarebezeichnungen und weitere Stichworte und sonstige Angaben, die in diesem Buch verwendet werden, sind als eingetragene Marken geschützt.

Da es nicht möglich ist, in allen Fällen zeitnah zu ermitteln, ob ein Markenschutz besteht, wird das Symbol (R) in diesem Buch nicht verwendet.

Autoren

Robert Großkopf

Mitwirkende

Klaus-Jürgen Weghorn

Rückmeldung (Feedback)

Kommentare oder Vorschläge zu diesem Dokument können Sie in deutscher Sprache an die Adresse discuss@de.libreoffice.org senden.

Vorsicht

Alles, was an eine Mailingliste geschickt wird, inklusive der E-Mail-Adresse und anderer persönlicher Daten, die die E-Mail enthält, wird öffentlich archiviert und kann nicht gelöscht werden. Also, schreiben Sie mit Bedacht!

Datum der Veröffentlichung und Softwareversion

Veröffentlicht am 10.4.2018. Basierend auf der LibreOffice Version 6.0.

Inhalt

Einleitung

Ein XML-Formular Schritt für Schritt

Datensammlung formatiert

Erstellen einer XSL-Datei zur Formatierung

Kopieren der neuen Daten in eine dauerhafte Datendatei

Formulareingabe optimieren

Versandmethoden für den Formularinhalt

POST-Methode

GET-Methode

PUT-Methode

Komplexere Formulardefinition

Definition der Instanzen

Daten verschicken

Bindungen für Formularfelder

Formularfelder

Eingabebedingungen

Erforderlich

Relevant

Einschränkung

Schreibschutz und Berechnen

Formatierte Ausgabe in XML-Dokumenten

XML-Formulare mit Datenbankanbindung nutzen

Makrozugriff über die Bindungen des XML-Formulars

Base-Tabellen erstellen

Makrozugriff auf die Base-Datenbank

Abgespeicherte XML-Dateien einlesen

Anhang

Submissions-Methoden

Xforms Funktionen

XPath Operators

 

 

Einleitung

Mit XML-Formulardokumenten werden Formulare erstellt, die XML-Dateien erzeugen.Diese werden in ihrer entsprechenden Struktur mit Daten versehen, die z.B. lokal gespeichert werden. Außerdem kann so ein Formular dazu genutzt werden, Daten in einer XML-Datensammlung zu speichern und über einen Browser in einer sinnvollen Übersicht auszugeben.

Für das Ausführen eines mit LibreOffice erstellten XML-Formulars ist eine Installation von LibreOffice erforderlich. Mit anderen Programmen als den LibreOffice verwandten Office-Programmen ist die Nutzung von XML-Formulardokumenten nicht möglich.

In dieser Dokumentation geht es darum, zuerst einmal ein einfaches Formular erstellen zu können. Anschließend wird gezeigt, wie die Inhalte eines solchen Formulars weiter genutzt werden können und zu größeren Datensammlungen, auch über das Internet mit einem Server, zusammengefasst werden können.

Im Gegensatz zu einfachen Formularen kann die Eingabe der Daten mit XML-Formularen für jedes Feld sehr genau eingegrenzt werden, ohne dass dafür, wie z.B. in Base, der Einsatz von Makros erforderlich wäre. Auch Berechnungen während der Eingabe sind problemlos möglich. Dies wird anschließend anhand eines komplexeren Formulars erklärt, das möglichst viele der zur Verfügung stehenden Funktionen der XML-Formulare nutzt.

Tipp

Um XML-Formulardokumente erstellen und verwalten zu können – und damit Grundlagenwissen dieser Dokumentation – sind das Verständnis und die sichere Handhabung von:

  • Erstellen und Bedienen von Formularen in LibreOffice 

  • Beherrschen von Formularsteuerelementen in LibreOffice 

  • Erstellen und Bedienen von Makros in LibreOffice. 

Sollten Sie hier noch nicht so firm sein, finden Sie weitere Hinweise in den Erste-Schritte-Handbüchern sowie im Base- und im Macro-Handbuch:
https://de.libreoffice.org/get-help/documentation/

 

Hinweis

XML-Dateien, also auch die Daten, die über XML-Formulare verarbeitet werden, sind nicht weiter gesichert. Die Dateien sind im Klartext lesbar, können im Browser übersichtlich dargestellt werden und enthalten standardmäßig keinen weiteren Schutz. Bei Formularen, die den Inhalt über das Netz verschicken, muss der Schutz entsprechend in die Auswertung eingebaut werden. Werden Daten über Email weitergeleitet, so sollten die Mails möglichst verschlüsselt werden.

 

Hinweis

XML-Dateien, die das Formular erzeugt, haben den folgenden Aufbau:1

<?xml version="1.0" encoding="UTF-8"?>

<instanceData>

        <Vorname>Lieschen</Vorname>

        <Nachname>Müller</Nachname>

</instanceData>

Einem einführenden Tag, der die Datei als XML-Datei kennzeichnet und zusätzlich noch den verwendeten Zeichensatz enthält, folgt ein Element, das die gesamten Daten umfasst. In der Regel gibt es zu jedem Element einen Starttag und einen Endtag, wobei der Endtag an dem / zu erkennen ist. Text, der zwischen diesen Tags steht, enthält die Daten, hier also den Vornamen «Lieschen» und den Nachnamen «Müller».

Ein XML-Formular Schritt für Schritt

LibreOffice wird gestartet.

Über Datei → Neu → XML-Formulardokument wird eine Writeransicht zusammen mit der für XML-Formulare erforderlichen Seitenleiste erstellt.

Wird die Symbolleiste für die Formular-Steuerelemente nicht angezeigt, so kann diese über Ansicht → Symbolleisten → Formular-Steuerelemente eingeblendet werden.

               

In dem Reiter Instance 1 liegt bereits das umfassende Element instanceData. Diesem Element werden im folgenden zwei gleichberechtigte Elemente hinzugefügt.

Der dabei erscheinende Dialog wird jeweils nur in der Eigenschaft Name bearbeitet. Hier sind die Untergliederungen «Vorname» und «Nachname» hinzugefügt worden. Dadurch ist die komplette durch dieses Formular zu erstellende XML-Datei definiert.

Im Reiter Submissions wird eine Submission hinzugefügt.

Die Submission wird mit dem Namen «Absenden», dem Pfad für die Aktion auf dem lokalen Rechner und der Methode «Put» (siehe: PUT-Methode) versehen. Bei «Absenden» wird das vorherige Dokument «Beispiel.xml» mit dem neuen Inhalt überschrieben: Ersetzen → Dokument.

Die entsprechenden Einträge für die Submission lassen sich unter dem Reiter Submissions anzeigen.

Jetzt wird eine Bindung hinzugefügt, die den Angelpunkt zu den geplanten Formularfeldern darstellt. Nur so ist es möglich, die Formularfelder mit den entsprechenden Instanzen zu koppeln.

Die Bindungen werden durchnummeriert, können natürlich auch mit separaten Namen versehen werden. Wird hier der gleiche Ausdruck wie bei den Instanzen als Bindungsausdruck eingegeben, so erfolgt die entsprechende Koppelung zu den Instanzen.

Jede Bindung wird mit entsprechenden Eigenschaften versehen. Diese können aber auch bereits bei der Festlegung der Instanzen mit dem gleichen Dialog erstellt werden. Gegebenenfalls können sie auch noch in den Formularfeldern nachgetragen werden.

 
Aus den Formular-Steuerelementen2 wird das Textfeld ausgesucht. Im Gegensatz zu Datenbanken erfolgt jetzt im Reiter Daten eine Verknüpfung zu dem Datenmodell.

In diesem Beispiel steht nur das Model 1 zur Verfügung. Bindung lässt mit einem Auswahlfeld die Auswahl der beiden definierten Bindungen zu, hier also von Bindung 1. Die restlichen Einträge spiegeln die Definition der Bindung wieder.

Dem Formular wird ein Button hinzugefügt. In den allgemeinen Eigenschaften wird hier die Aktion → Formular übertragen ausgewählt. In dem Feld Submission ist jetzt [Model 1] Absenden verfügbar.

Wird jetzt über die Symbolleiste der Entwurfsmodus des Formulars ausgeschaltet, so ist die Eingabe von Daten in das Formular möglich. Durch die rote Umrandung und die Zusatzinformation weist das Formular darauf hin, dass in den Feldern auf jeden Fall eine Eingabe erforderlich ist.

Nach erfolgter Eingabe und dem Absenden bleiben die Daten in dem Formular stehen. Unter dem Reiter Instance 1 sind jetzt die Inhalte der Untergliederungen Vorname und Nachname zu erkennen. Die Daten wurden in die definierte XML-Datei geschrieben und über das Formular wieder ausgelesen. Sie bleiben auch in dem Formulardokument weiter erhalten. Das Formular zurücksetzen kann hier nur ein Makro.

 

Die XML-Datei «Beispiel.xml» weist zwei Zeilen auf. Sie startet mit der Definitionszeile und schreibt dann alle folgenden Einträge des Elements «instanceData» in eine Zeile.

Wird die Datei mit Firefox geöffnet, so erkennt Firefox den Aufbau der XML-Datei und stellt sie entsprechend gegliedert dar. Firefox fehlen hier lediglich Style-Informationen, die statt der Baum-Ansicht eine nutzerfreundlichere Ansicht bieten.

Datensammlung formatiert

Schöner wäre es natürlich, wenn Firefox Style-Informationen erhalten würde und nicht nur die aktuellen Daten gesammelt würden. Das sähe dann beispielsweise so aus:

Um dies zu bewerkstelligen muss an unterschiedlichen Stellen nachgearbeitet werden.

Erstellen einer XSL-Datei zur Formatierung

Die XML-Datei bezieht seine Formatierungen aus einer Datei mit separaten Formatanweisungen. Die Datei «Daten_Start_formatiert.xsl» hat die folgende Struktur:

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

        <xsl:template match="/">

                <HTML>

                        <Head>

                                <Title>XML-Formular</Title>

                        </Head>

                        <Body>

                                <H2>Daten aus dem XML-Formular</H2>

                                <table>

                                        <tr>

                                                <th>Nachname</th>

                                                <th>Vorname</th>

                                         </tr>

                                        <xsl:for-each select="Data/instanceData">

                                        <xsl:sort select="Nachname" order="ascending" data-type="text" />

                                        <tr>

                                                <td><xsl:value-of select="Nachname"/></td>

                                                <td><xsl:value-of select="Vorname"/></td>

                                        </tr>

                                        </xsl:for-each>

                                </table>

                        </Body>

                </HTML>

        </xsl:template>

</xsl:stylesheet>

Die Datei enthält innerhalb der Tags, die für die XSL-Datei notwendig sind, einen Aufbau wie eine einfache HTML-Datei. Diese HTML-Datei besteht aus einer Überschrift und einer Tabelle mit den Spaltentiteln «Nachname» und «Vorname».

In einer xsl:for-each-Schleife wird aus der XML-Datei alles ausgelesen, was sich innerhalb des Bereiches instanceData befindet. Da instanceData mehrmals vorkommt, muss hier die Schleife erfolgen.

Mit der xsl:sort-Anweisung werden die Daten, die sich in den instanceData-Bereichen befinden, nach dem Nachname aufsteigend sortiert.

Aus den Feldern Nachname und Vorname innerhalb von instanceData werden die entsprechenden Werte ausgelesen und in der Tabellenzeile dargestellt.

Die XML-Datei «Daten_Start_formatiert.xml» weist den folgenden Inhalt auf:

<?xml version="1.0" encoding="UTF-8"?>

<?xml-stylesheet type="text/xsl" href="Daten_Start_formatiert.xsl" ?>

<Data>

<instanceData><Vorname>Robert</Vorname><Nachname>Großkopf</Nachname></instanceData>

<instanceData><Vorname>Jutta</Vorname><Nachname>Schön</Nachname></instanceData>

<instanceData><Vorname>Ammon</Vorname><Nachname>Düül</Nachname></instanceData>

<instanceData><Vorname>Nick</Vorname><Nachname>Knatterton</Nachname></instanceData>

<instanceData><Vorname>Silvia</Vorname><Nachname>Bach</Nachname></instanceData>

<instanceData><Vorname>Rob</Vorname><Nachname>van Buur</Nachname></instanceData>

<instanceData><Vorname>Bob</Vorname><Nachname>Baumeister</Nachname></instanceData>

</Data>

In der zweiten Zeile dieser Datei wird darauf hingewiesen, dass die Darstellung in einer separaten Datei «Daten_Start_formatiert.xsl» definiert ist. Die Hauptinstanz <Data> darf hier nur einmal vorkommen, wie auch <instanceData> nur einmal in «Daten.xml» vorkommt.

Diese XML-Datei wird mit Hilfe eines Makros mit neuen Datensätzen aus der Datei «Daten_Start.xml» versorgt, die jeweils als neuer Tag <instanceData> als letzter Datensatz angehängt werden. Die Datei «Daten_Start.xml» ist dabei die, die das Formular standardmäßig über die Einträge von Submissions erstellt.

Kopieren der neuen Daten in eine dauerhafte Datendatei

Eine Kopie der Daten kann entweder händisch oder über ein Makro erfolgen. Das folgenden Makro ist an den Button des Formulars mit dem Ereignis → Maustaste losgelassen verknüpft.3

SUB DatenNachXmlDatei(oEvent AS OBJECT)

        DIM a()

        DIM b()

        stInstance = oEvent.Source.Model.Tag

Zuerst werden die Variablen definiert. Hier sind, im Gegensatz zum Quelltext, nur die unbedingt notwendigen Definitionen der Arrays aufgeführt, die zum Auftrennen von Texten benötigt werden.

Anschließend wird aus den Zusatzinformationen (Tag) des Buttons der Name der Instanz ausgelesen. In dem Beispiel steht dann hier «Data».

        oDoc = ThisComponent

        stDir = Left(oDoc.Location,Len(oDoc.Location)-Len(oDoc.Title))

        stFileTmp = stDir & "Daten_Start.xml"

        stFileData = stDir & "Daten_Start_formatiert.xml"

Aus dem aktuellen Formular wird der Pfad ausgelesen, indem einfach der Dateiname abgetrennt wird. Dann werden die Datenquelle «Daten_Start.xml» und das Ziel für die Daten «Daten_Start_forma­tiert.xml» mit dem Pfad verbunden. Beide Dateien befinden sich also im gleichen Verzeichnis wie die Formulardatei. «Daten_Start.xml» wird allerdings bei jeder Neueingabe vom Formular aus komplett überschrieben. Hier können also nicht Daten hinzugefügt werden.

        oFileAccess = createUnoService("com.sun.star.ucb.SimpleFileAccess")

        IF oFileAccess.exists(stFileTmp) THEN

                oInputStream = createUnoService("com.sun.star.io.TextInputStream")

                oFile = oFileAccess.OpenFileReadWrite(stFileTmp)

                oInputStream.SetInputStream(oFile.getInputStream)

                DO WHILE NOT oInputStream.isEOF

                        stTmp = stTmp & oInputStream.ReadLine()

                LOOP

                oInputStream.closeInput

Mit einem Uno-Service wird auf den SimpleFileAccess zugegriffen. Mit diesem wird die Datei «Daten_Start.xml» zeilenweise ausgelesen und in der Variablen stTmp zusammengefasst. Anschließend wird der Datenfluss beendet.

Die Variable stTmp wird aufgesplittet, so dass schließlich nur noch der Inhalt in stTmpData übrig bleibt, der in der Datei «Daten_Start.xml» nach dem mit «?>» endenden Tag steht.

                a = Split(stTmp,"?>")

                stTmpData = a(1)

Wie bei der ersten Datei wird jetzt auch die Datendatei «Beispiel_formatiert.xml» ausgelesen. Allerdings wird der beim Auslesen abgeschnittene Zeilenumbruch jedes Mal wieder mit CHR(13)&CHR(10) hinzugefügt.

                IF oFileAccess.exists(stFileData) THEN

                        oInputStream = createUnoService("com.sun.star.io.TextInputStream")

                        oFileData = oFileAccess.OpenFileReadWrite(stFileData)

                        oInputStream.SetInputStream(oFileData.getInputStream)

                        DO WHILE NOT oInputStream.isEOF       

                                stDataOld = stDataOld & oInputStream.ReadLine() & CHR(13) & CHR(10)

                        LOOP

                        oInputStream.closeInput

Die in die Datei zu schreibenden Daten werden aus den bestehenden Daten und der neuen Zeile neu zusammengestellt. Die Datei wird anschließend neu geschrieben. Zum Schluss wird die Ausgabe in die Datei wieder geschlossen.

                        oOutputStream = createUnoService("com.sun.star.io.TextOutputStream")

                        b = Split(stDataOld,"</" & stInstance & ">")

                        stDataNew = b(0) & stTmpData & CHR(13) & CHR(10) & "</" & stInstance & ">"

                        oFileData = oFileAccess.OpenFileReadWrite(stFileData)

                        oOutputStream.SetOutputStream(oFileData.getOutputStream)

                        oOutputStream.writeString(stDataNew)

                        oOutputStream.closeOutput()

                END IF

        END IF

END SUB

Wie hier nur am Beispiel des Umlesens der Daten gezeigt wurde kann so etwas natürlich auch zum Einlesen der Daten in eine Datenbank genutzt werden. Die Befüllung der Datenbank würde dann über ein Formular erfolgen, von dem aus die Person, die die Daten schreibt, nicht zwingend Zugriff auf die Daten hat, die bereits geschrieben wurden.

Formulareingabe optimieren

In der Standardeinstellung wird bei XML-Formulardokumenten immer die Seitenleiste mit den Datenstrukturen des XML-Formulars (Daten-Navigator) und die Formular-Steuerelemente angezeigt. Die Symbolleiste für den Formular-Entwurf zeigt gegenüber Base-Formularen ein zusätzliches Symbol, mit der der Daten-Navigator ausgeschaltet werden kann:

Der Daten-Navigator ist dann nicht mehr über die Funktion zum Einblenden der Seitenleiste anzeigbar. Wird dann zusätzlich noch die Symbolleiste für den Formularentwurf entfernt, so ist das Formular erst einmal gegen unbedachte Fehlnutzungen geschützt. Änderungen an diesen Stellen bewirken keine Änderungen an dem Dokument und können daher nicht mit dem Formular abgespeichert werden. Sie werden nur in den persönlichen Nutzereinstellungen gespeichert. Wird allerdings die Datei über Datei → Eigenschaften → Sicherheit → Optionen für Dateifreigabe → Schreibgeschützt öffnen beim Öffnen mit einem Schreibschutz versehen, so wird das Formular nur zur Eingabe von Daten geöffnet.

Versandmethoden für den Formularinhalt4

In dem Reiter Submissions sind die Versandmöglichkeiten für den Formularinhalt unter gebracht. Es stehen die für Internetformulare möglichen POST- und GET-Methoden sowie die nur lokal gebräuchliche Methode PUT zur Verfügung. Die POST-Methode wird in dem Editor allgemein als «Senden» bezeichnet.

POST-Methode

Hier wird der gesamte Inhalt als ein Element übertragen. Diese Methode findet Anwendung für größere Formularinhalte oder auch für den Versand per Mail. Unter Aktion ist dann einzutragen:

http://www.example.com/xmldata.php

mailto:lieschen.mueller@example.org

Der Mailversand läuft leider nicht ordnungsgemäß mit diesem Kommando ab, so dass er nur mit Hilfe eines Makros und der PUT-Methode möglich ist.

Die Methode ruft mit dem Eintrag Submissions → Ersetzen → Dokument die ausführende Datei mehrmals auf, dabei ab dem 2. Mal ohne Inhalt. Außerdem öffnet Writer z.B. die Datei «xmldata.php». Wird stattdessen der Eintrag Submissions → Ersetzen → Kein gewählt, so kann der Inhalt anschließend durch das Script am Server einwandfrei verarbeitet werden.

Der Empfang der gesandten Daten gestaltet sich etwas problematisch, da der Inhalt der xml-Datei verschickt wird. Die o.g. «xmldata.php» müsste dann mit dem folgenden Befehl auf die Struktur der Datei zugreifen:

<?php

//Datei xmldata.php

$datafile = file_get_contents("php://input");

?>

Der Inhalt sieht dann so aus:

<?xml version="1.0" encoding="UTF-8"?>

<instanceData><Vorname>Lieschen</Vorname><Nachname>Müller</Nachname></instanceData>

Sollen die Daten gleich in eine formatierte XML-Datensammlung eingebunden werden, so erfolgt direkt in der PHP-Datei die Weiterverarbeitung:

<?php

//Datei xmldata.php

$datafile = file("php://input");

IF (count($datafile) > 1) {

        $data = $datafile[1];

        IF (file_exists("data/Daten_einfach_formatiert.xml")) {

                $datei = file("data/Daten_einfach_formatiert.xml") ;

                $maxNode = $datei[count($datei)-1];

                array_pop($datei); // letztes Element löschen

                $datei[] = $data."\r\n</".$maxNode.">";

                $datei_alt = fopen("data/Daten_einfach_formatiert.xml", "w+") ;

                foreach($datei as $zeile){

                        fwrite($datei_alt, $zeile);

                }

                fclose($datei_alt);

        }

}

?>

Zuerst wird der Inhalt über file in ein Array gelesen. Enthält das Array neben der ersten Zeile Daten, so erfolgt eine Weiterverarbeitung. Der Dateninhalt des Arrays befindet sich in dem 2. Arrayelement, also $datafile[1], da die Zählung mit «0» beginnt. Die zu beschreibende Datei liegt in dem obigen Beispielcode in einem Unterverzeichnis «data». Diese Datei wird in ein PHP-Array zeilenweise ausgelesen. Das letzte Element des Arrays, das den Abschlusstag enthält, wird ausgelesen und anschließend aus dem Array gelöscht. Danach wird der neue Datensatz sowie der Abschlusstag, mit einem Zeilenumbruch, an das Array angehängt. Zum Schluss wird das Array wieder in die Datei geschrieben.

Sicher gibt es hier auch Methoden, mit denen z.B. nur die letzten Buchstaben der vorhergehenden Datei entfernt werden können.

GET-Methode

Diese Methode ist im Internet vor allem bei Suchmaschinen beliebt. Der gesamte Inhalt des Formulars wird über die URL in der Adressleiste des Browsers sichtbar weitergegeben. Dort steht dann unter Aktion z.B.

http://www.example.com/xmldata.php?Vorname=Lieschen&Nachname=M%FCller

Prinzipiell unterscheidet sich bei den XML-Formulardokumenten die Methode POST nicht von der Methode GET. In beiden Methoden wird nur ein kompletter Datensatz wie oben gezeigt als Datei weitergegeben.

Auch hier sollte, wie bei der POST-Methode, der Eintrag Submissions → Ersetzen → Kein gesetzt werden.

PUT-Methode

Hier wird eine lokale Adresse eingetragen. Es wird eine Datei lokal geschrieben und abgelegt. Wird die Datei nicht rechtzeitig weiter verarbeitet, so wird der Inhalt mit einem erneuten Abschicken des Formulars überschrieben. Als Aktion steht dort dann z.B.

file:///home/user/Dokumente/datendatei.xml

Auch unter Windows ist darauf zu achten, dass keine Backslashes verwandt werden. Dort also z.B.

file:///c:/tmp/datendatei.xml

Über ein Makro lässt sich diese Datendatei auch an eine Mail anhängen. Das Mailprogramm wird dabei gestartet und das Absenden muss nur noch veranlasst werden:

SUB Mailversand

        DIM attachs(0)

        IF GetGuiType() = 1 THEN

                oMailer = createUnoService("com.sun.star.system.SimpleSystemMail")

                ' Sonst Linux/Mac

        ELSE

                oMailer = createUnoService("com.sun.star.system.SimpleCommandMail")

        END IF

        oMailProgram = oMailer.querySimpleMailClient()

        oMessage = oMailProgramm.createSimpleMailMessage()

        oMessage.setRecipient("lieschen.mueller@example.org")

        oMessage.setSubject("XML-Daten")

        attachs(0) = "file:///home/user/Dokumente/datendatei.xml"

        oMessage.setAttachement(attachs())

        oMailProgram.sendSimpleMailMessage(oMessage, 0 )

END SUB

Komplexere Formulardefinition5

Das Einstiegsbeispiel hatte erst einmal nur zum Ziel, die prinzipielle Funktion eines XML-Formulars zu zeigen und dabei direkt aufkommende Probleme zu lösen. Jetzt soll es darum gehen, XML-Formulare genauer zu durchschauen.

XML-Dateien starten mit der Nennung der XML-Version und der entsprechenden Kodierung für die Schriftzeichen, die verwendet werden. Der entsprechende Tag dazu nimmt immer die erste Zeile der Datei ein.

Der gesamte weitere Inhalt wird durch Elemente strukturiert. Dabei werden für wohlgeformte XML-Dateien folgende Punkte definiert6:

Definition der Instanzen

Jedes Modell hat genau eine Instanz. Werden mehrere Instanzen, z.B. für die Erstellung von Listenfeldern, benötigt, so muss über Modelle → Hinzufügen ein neues Modell erstellt werden. In einem neuen Modell sind Instanzen, Submissions und Bindungen neu. In einem Formular können mehrere Modelle existieren. Es kann von Modell zu Modell zum Bearbeiten umgeschaltet werden.

Das obige Modell «LO_eV» hat eine Instanz «Mitglied». Standardmäßig ist das Root-Element «instanceData». Die Umbenennung des Root-Elements ist zur Zeit leider über die GUI nicht möglich.

Tipp

«instanceData» ist, entgegen anderer Anleitungen zu OpenOffice 2.0, der feste Startbegriff für die Daten und kann nicht geändert werden. Eine Umbenennung ist nur über das Einlesen einer XML-Datei möglich:

<?xml version="1.0" encoding="UTF-8"?>

<Mitglied>

</Mitglied>

Wird der obige Inhalt als einfache Textdatei abgespeichert und mit dem Namen «Start.xml» versehen abgespeichert, so kann über Instanzen → Bearbeiten der Link zu dieser Datei eingelesen werden. «Mitglied» wird dann zum Startbegriff.

Nachdem «Mitglied» als Startbegriff erscheint sollte der Link wieder aus dem Dialog entfernt werden. Ein Hinzufügen von Elementen ist sonst nur scheinbar möglich und verschwindet beim nächsten Formularstart.

Dem Mitglied sind verschiedene Elemente baumartig untergeordnet. Enthalten Felder Werte, so sind diese über den Baum ersichtlich. Außerdem erscheinen die Werte auch im Formular selbst.

Werden den Feldern direkt auch über Element bearbeiten → Einstellungen → Datentyp Datentypen zugeordnet, so erstellt der Daten-Navigator automatisch die entsprechenden Bindungen, die für die Formularfelder nötig sind.

Hinweis

Datentypen können nur für Kindelemente, nicht aber für ein Elternelement eindeutig festgelegt werden. So müsste beim Element «Person» der Datentyp leer bleiben, da die Kindelemente «Vorname», «Nachname», «Geschlecht» und «Geburtsdatum» keinen einheitlichen Datentyp haben.

Bei den Modulen werden die Werte über Attribute, hier «selected» gespeichert. Im Daten-Navigator sind diese Werte nicht sichtbar. Die Bezeichnung mit «@» weist übrigens innerhalb von XML darauf hin, dass es sich um ein Attribut des jeweiligen Elementes handelt. Der eigentlich eingegebene Name des Attributs wird ohne «@» geschrieben.

Für den Inhalt von Listenfeldern müssen die Werte in einem neuen Modell, hier «LO_Bundesland», erstellt werden. Dabei sind alle Elemente der 2. Stufe mit gleichem Namen benannt. So kann später über die Bindungen eine Liste aller Felder abgefragt werden. Die entsprechenden Landesbezeichnungen werden in den Eigenschaften als Defaultwerte eingetragen.

Hinweis

Bei der Änderung von Eigenschaften bei den Instanzen oder auch anderen Elementen kann es passieren, dass der Daten-Navigator die Änderungen in anderen Elementen nicht aktualisiert. So macht sich z.B. eine Änderung bei den Eigenschaften eines Feldes in den Instanzen erst nach dem Abspeichern, Schließen und erneutem Öffnen des Formulardokumentes auch bei den Bindungen bemerkbar.

Daten verschicken

Für die Buttons zur Weiterverarbeitung werden zwei Möglichkeiten erstellt:

  1. 1.Die Möglichkeit, die Daten direkt zu speichern, kombiniert eventuell mit dem weiter oben vorgestellten Makro, die Daten in einer zentralen XML-Datei weiter zu verarbeiten. 

  2. 2.Die Möglichkeit, Daten an einen Server zu schicken. Dort wird die Datei in diesem Falle mit einer *.php-Datei weiter verarbeitet. 

Bindungen für Formularfelder

Die Bindungen für die Formularfelder werden dann automatisch erstellt, wenn bei Erstellen der Elemente bereits ein Datentyp angegeben wurde. Ansonsten wird hier der gesamte Pfad ohne das Wurzelelement, wie aus dem Screenshot ersichtlich, angegeben.

Bei der Bindungsbezeichnung muss darauf geachtet werden, dass die Bezeichnungen bei unterschiedlichen Modellen nicht gleichen. Die Namensgebung funktioniert nämlich nur innerhalb eines Modells einwandfrei. Bindungen werden dort einfach durchnummeriert. Wird eine Bindung gelöscht, so wird die Nummer anschließend wieder neu vergeben.

Hier wird die Bindung für das Listenfeld deutlich unterschiedlich zu den anderen Bindungen mit «Bindung_Land» benannt.

Formularfelder

Die Eigenschaften der Formularfelder unterscheiden sich deutlich von Formularfeldern z.B. in Base. Beim Optionsfeld weist lediglich der Referenzwert den gleichen Charakter auf. Optionsfelder mit gleichem Namen zeigen auch hier die Eigenschaft, dass nur eine Option ausgewählt werden kann.

Alle weiteren Daten-Eigenschaften entsprechen den Eigenschaften, die bereits vorher für das entsprechende Feld eingestellt wurden. Zuerst wird das XML-Datenmodell «LO_eV» gewählt, dann aus diesem Modell die entsprechende Bindung. Dabei muss hier immer der Blick auf die ausgeschriebenen Bindungen des Daten-Navigators gerichtet werden. Wer weiß schon auswendig, dass sich hinter «Bindung 6» das Feld «Person/Geschlecht» verbirgt?

Die weiteren Einstellungen entsprechen dem der Elementdefinition. Die Eingaben unterhalb von Datentyp sind zwar ausgegraut, aber einstellbar. Hier ist allerdings das folgende Vorgehen zu beachten:

Ein neuer Datentyp wird erstellt, damit die Postleitzahl korrekt ist.