|
allegro und XML |
|
Offiziell:
http://www.w3.org/XML/
Beispiele:
MARCXML und MABXML
|
XML Schnellkurs Hier soll es nur um die elementaren, um die allerwichtigsten Dinge gehen! Damit man den Wald erblickt und nicht nur lauter Bäume...
#40 Goethe, Johann Wolfgang ¬von¬
<Verfasser>Goethe, Johann Wolfgang <nichtsort>von</nichtsort></Verfasser>
<Author> <FirstName>Johann Wolfgang</FirstName> <nonsort>von</nonsort> <LastName>Goethe</LastName> </Author>
<tag>irgendwelche Daten</tag>
<Person typ="author">Lessing, Gotthold Ephraim</Person>
<Person typ="author"><Nachname>Lessing</Nachname><Vorname>Gotthold Ephraim</Vorname></Person> oder<Personen>
<Person
typ="author"><Nachname>Schiller</Nachname><Vorname>Friedrich</Vorname></Person>
Für die traditionellen bibliothekarischen Austauschformate MARC21 und MAB2 existieren inzwischen XML-Varianten: MARCXML und MABXML. Beispiele siehe unten. Diese definieren keine neuen, verbalen Labels für die Datenelemente, sondern verpacken die altbekannten Formatnummern nur als Attribute. Damit ändert sich an der Inkompatibilität der Formate überhaupt nichts. XML ist nicht gleichbedeutend mit Kompatibilität. Was XML vereinheitlicht, das ist nur die formale Art der Datenauszeichnung: die alten Nummern sind nun mit spitzgeklammerten Labels ausgezeichnet statt mit bestimmten Steuerzeichen. Dadurch kann man nun mit allgemein üblichen Werkzeugen auf die Daten losgehen, statt immer neue Spezialprogramme dafür zu schreiben. Mehr aber nicht. Mit anderen Worten: Es wird nicht MARC oder MAB durch XML ersetzt, das wäre eine grob unsachliche Aussage, sondern nur die bisherigen Steuerzeichen (eine Norm namens ISO2709) durch XML-Spitzklammern. Eine Neuentwicklung der Library of Congress, MODS, ersetzt die Nummern von MARC durch verbale Tags, englische natürlich. MODS ist, anders als MARCXML, nicht mehr 100% mit MARC21 kompatibel, sondern bildet nicht alle MARC-Einzelheiten ab. Es ergeben sich nun für allegro zwei Fragen:
1. Wie bekommt man XML-Daten in eine allegro-Datenbank hinein? Drei Möglichkeiten stehen zur Wahl: 1. Umwandlung mit der Importsprache, Einspeisen mit dem Programm UPDATE Die mächtigste, aber schwierigste Methode; nur für fortgeschrittene allegrologen 2.
Mit FLEX:
geeignet, wenn nur einzelne, nicht allzu viele Felder aus
XML-Fremddaten zu
übernehmen sind und die Feldinhalte mehr oder weniger unverändert
übernommen
werden können. Die Importsprache bietet dagegen mehr Funktionen für das
Manipulieren
einzelner Datenfelder. 3. Vorher die XML-Daten mit eigenen Programmen in die allegro-Externstruktur umwandeln, dann mit dem Menü "Datei / Weitere Offline-Datei laden" einlesen. Welche Software man für die externe Umwandlung benutzt, das spielt natürlich für allegro keine Rolle.
Dazu gibt es jetzt (ab V24.4) ebenfalls drei Wege: 1. Export mit Hilfe der Exportsprache Die mächtigste, aber schwierigste Methode. Jedes kleinste Detail kann damit programmiert werden. Dieser Weg ist zu wählen, wenn die Daten einem von außen vorgeschriebenen XML-Schema entsprechen sollen, wie etwa MARCXML oder MABXML. Bei solchen Schemata ist es typisch, allegro-Elemente in einer vorgeschriebenen Reihenfolge in mehrere Teile auseinanderzunehmen oder auch anders zusammenzusetzen oder ineinander zu verschachteln. 2. Ausgabe der Daten mit Hilfe von FLEX-Makros Schnell und relativ einfach zu realisieren, etwas weniger mächtig in den Details der Umwandlung. Diese Methode kommt in Betracht, wenn man einige Datenelemente für nicht allzu komplizierte externe Verwendungszwecke braucht, wie etwa für statistische Auswertungen. 3. Den neuen FLEX-Befehl xml einsetzen Wandelt einen Datensatz als Ganzes um in vier verschiedene Standard-Strukturen. Das macht kaum Arbeit, allenfalls kleinere Eingriffe in die Konfigurationsdatei (.CFG-Datei) sind nötig, in der die Feldbezeichnungen stehen. Dieses Verfahren ist sinnvoll, wenn die Daten extern gebraucht werden und es nicht so genau auf deren Struktur ankommt, sondern darauf, ob man sie dann mit XML-Werkzeugen bearbeiten kann.
<tag>Text des Datenfelds</tag> Der
XML-Text steht dann als
Ganzes in der internen Variablen! Das ist aber nur eine Zugabe. Er wird
in derselben Form sogleich in die Ausgabedatei geschrieben, denn das
wird in aller Regel der Sinn der Sache sein. Damit in der Ausgabedatei
aber Unicode ankommt (intern ist normalerweise kein Unicode!), sind
zusätzlich vorher die folgenden drei Befehle zu geben, damit die
Akzentvertauschung und
die Unicode-Umcodierung ausgeführt werden: Ferner die nötigen write-Befehle vorher und nachher, um den Datensatz angemessen in umschließende Tags einzubetten, denn der Befehl selbst produziert nur die nackten Datenelemente, kein Drumherum. Das Drumherum kann aber genausogut in die Exportparameter eingebaut werden, unter der Sprungmarke #-X ! Als Komplettbeispiel kann man sich den FLEX xmlexp.flx ansehen, mit dem man die aktuelle Ergebnismenge in eine Datei mit XML-Struktur überführt. Dieser wird aktiviert über den neuen Menüpunkt "XML-Ausgabe" auf dem Exportmenü (in den "Komfort-Methoden").
0 : <label>...</label> Hier ist label die Bezeichnung, die sich aus der CFG ergibt. Wenn das Datenfeld eine Mehrfachkennung hat, wird zuerst die Abfrageliste von oben nach unten nach der Kategorienummer durchsucht. Wird dort nichts gefunden, oder steht Spatium hinter der Kategorienummer, wird die Deskriptorenliste durchsucht (die Zeilen, die mit # anfangen). 1 : <feld nr="knum">...</feld> knum ist die Kategorienummer 2 : <feld lb="label">...</feld> Wie 0, aber statt der Kategorienummer wird im Attribut lb das Label angegeben 3 : <feld nr="knum" lb="label">...</feld> Kombination aus 1 und 2
Die zentrale Rolle für den xml-Befehl spielt also die CFG, die man verwendet. Mit ihrer Hilfe kann man das Ergebnis stark beeinflussen. In der Standarddatei $A.CFG wurden die Labels in den Deskriptorenzeilen alle XML-gerecht gestaltet: ohne Leer- und Sonderzeichen.
Stellen Sie drei Dinge sicher: 1. alle vorkommenden Felder müssen eine Bezeichnung in ihrer Deskriptorzeile haben Das sind die Zeilen, die mit # anfangen, z.B. #20"Titel"... 2. Felder, die mit bestimmten Wiederholungszeichen eine andere als die Grundbedeutung haben, müssen mit einer eigenen Bezeichnung in der Abfrageliste vorkommen, z.B. so (ohne # vorne): 57i" Interpret: " 3. die Feldbezeichnungen dürfen in jedem Fall nur aus Buchstaben, Ziffern, Bindestrich oder Unterstrich bestehen, das erste Zeichen darf nur ein Buchstabe sein. Nur Grundbuchstaben, keine Umlaute etc.! (Die Bezeichnung wird am ersten Leer- oder Sonderzeichen abgeschnitten!) Beispiel: #57"anderePerson" Deskriptorzeile für #57 57d"Dirigent:" Abfragezeile für #57d Wenn man die Abfrageliste ansonsten nicht braucht, ist es einfach: man listet unterhalb der Deskriptoren alle Felder in der zweiten Form auf. Und die Reihenfolge? Die Felder kommen in der Reihenfolge heraus, wie sie im Datensatz stehen - und das ist die Reihenfolge der Deskriptorzeilen in der CFG. Will
man eine andere:
schnell eine abgewandelte CFG machen mit Deskriptorzeilen in der
gewünschten
Reihenfolge,
ansonsten alles gleich, kein Eingriff in die Daten nötig. Eine so
modifizierte CFG kann gefahrlos
eingesetzt
werden auch beim Bearbeiten von Sätzen! Den Namen dieser Datei
einsetzen in die Befehlszeile Konfiguration= in der INI-Datei.
Dann schreibt man im FLEX vor den xml-Befehl die Liste der betreffenden Felder, die Reihenfolge ist dabei beliebig. Wenn
z.B. #81, #99e und
#99n nicht mit ausgegeben werden sollen; #99n #81 #99e xml 1 undo Denn die Felder werden dadurch aus dem aktuellen Satz im Arbeitsspeicher gelöscht! Durch undo wird das wieder rückgaengig gemacht. Genauer gesagt: der unveränderte, in der Datenbank befindliche Satz wird wieder gültig gemacht, der verkürzte im Arbeitspeicher ungültig.
Geben Sie im Schreibfeld ein: x xml 0\sho IV und
dann statt der 0
hintereinander 1,2,3. Sofort sehen Sie, was gemeint ist. In der
Doku-Datei xxml.rtf ist das für jeden
Modus als Flip eingebaut.
Teilfelder (in MAB "Unterfelder" genannt) Damit wird immer in derselben Weise umgegangen: Aus #nnn Textâ–¼aTeilfeld aâ–¼bTeilfeld b wird <label>Text<uf code="a">Teilfeld a</uf><uf code="b">Teilfeld b</uf></label>
Nichtsortierzeichen Auch damit wird immer in derselben Weise umgegangen: Aus #20 ¬Die¬ Erkenntnis der Natur wird <Titel><ns>Die </ns>Erkenntnis der Natur</Titel> Die
Nichtsortierzeichen können
an jeder beliebigen Stelle in jedem Datenfeld vorkommen! In
beiden Fällen sind dieselben Abkürzungen verwendet, ns und uf, die in
MABXML definiert wurden.
BEISPIELE (und ein paar subjektive Anmerkungen) Beispiel für zwei Datenelemente in MARCXML: <datafield tag="245" ind1="1" ind2="0"> <subfield code="a">Arithmetic /</subfield> <subfield code="c">Carl Sandburg ; illustrated as an anamorphic adventure by Ted Rand. </subfield> </datafield> <datafield tag="260" ind1=" " ind2=" "> <subfield code="a">San Diego :</subfield> <subfield code="b">Harcourt Brace Jovanovich,</subfield> <subfield code="c">c1993.</subfield> </datafield> Im klassischen MARC sieht das so aus:
Für diesen Standard wurden, wie man sieht, keine verbalen Tags erfunden, man hat vielmehr die MARC-Nummern als Attribute für das Tag <datafield> genommen. Auffällig ist die Interpunktion am Ende der Unterfelder, typisch für MARC21 (aber nicht für Unimarc oder das abgeschaffte UKMARC) : sie bleibt auch in der XML-Version erhalten! Das wird von XML-Experten für sehr unschön gehalten, unelegant war es schon immer, ist aber wegen der angestrebten 100% Kompatibilität unvermeidlich. Nebenbei (es interessiert niemanden): in XML werden für diese Datenelemente 400 Byte verbraucht, im alten MARC 146. Für solche Verschwendung gibt es keinen zwingenden Grund. Ohne weiteres hätte man z.B. df statt datafield und sf statt subfield definieren können. Und wenn XML es zuließe, statt der betulichen Wiederholung des Tags am Feldende so etwas wie </> zu schreiben, würde auch einiges gespart, und zwar bei jeder XML-Anwendung. Sparsamkeit ist jedoch nicht im Sinne der Hardwareindustrie, die an dem Zustandekommen der Standards nicht ganz unbeteiligt ist. Aber solche Auswüchse werden allenthalben klaglos geschluckt, schon ein Hinweis darauf wird nicht gern gehört. Man sollte es sich aber mal klarmachen: Wenn jeder MARC-Satz nur 10 Felder hätte und 20 Unterfelder, dann enthielten 1 Mio. Datensätze insgesamt 20 Millionen mal das Wort "datafield" und 40 Millionen mal "subfield". Ist das elegant? Zusammen mit den Spitzklammern wären das allein für diese Tags mindestens 880MB mehr als beim alten MARC. Zum Vergleich: der allegro-OPAC der UB Braunschweig braucht bei 1.1 Mio. Datensätzen weniger als 800 MB insgesamt, incl. Index und allen anderen Dateien. Sie sollten das jedoch nicht überbewerten, es interessiert wirklich niemanden - "Platten kosten doch nichts mehr!". Wenn man XML nur zum Austausch benutzt, kann man in der Tat darüber hinwegsehen. Aber der Programmierer, der hinterher mit den Daten umgeht, hat dann jedesmal "datafield" etc. hinzuschreiben statt "df" - vielleicht ist das eine Überlegung wert? (Denn Programmiererzeit kostet schon noch was und wird im Gegensatz zu den Platten immer teurer.) Dieselben Datenelemente in MODS: Gans anders als in MARCXML gibt es hier verbale Tags, außerdem mehr Verschachtelungen. Es besteht aber wohl noch Unklarheit hinsichtlich der Interpunktion! <titleInfo> <title>Arithmetic /</title> </titleInfo> <note type="statement of responsibility">Carl Sandburg ; illustrated as an anamorphic adventure by Ted Rand.</note> <originInfo> <place> <code authority="marc">cau</code> <text>San Diego</text> </place> <publisher>Harcourt Brace Jovanovich</publisher> <dateIssued>c1993</dateIssued> <dateIssued encoding="marc">1993</dateIssued> <edition>1st ed.</edition> <issuance>monographic</issuance> </originInfo> Ein wenig sparsamer ist man hingegen doch beim MABXML-Entwurf gewesen, der ebenfalls verbale Tags vermeidet und die alten Nummern in Attribute einbettet: Beispiel für vier Datenelemente in MABXML: <feld nr="331" ind=" ">Journal of neurology für Testzwecke und Validation Lokaldaten Heise</feld> <feld nr="335" ind=" ">official journal of the European Neurological Society</feld> <feld nr="341" ind=" ">Zeitschrift für Neurologie</feld> <feld nr="370" ind="a">Organ d. Deutschen Gesellschaft für Neurologie u. d. Deutschen Gesellschaft für Neurochirurgie</feld> Und für Unterfelder bzw. Teilfelder hat man <uf code=...> bzw. <tf/> definiert. |