Ich muss mehrere Texte, die als txt vorliegen, in TEI-komforme XML-Dateien umwandeln. Das Schema liegt als RNG-Schema vor.
Wenn ich es richtig sehe, kann ich das, was ich suche, mittels XML.etree verwirklichen.
Dann zerfällt meine Aufgabe in folgende Teile:
1. Einlesen der Datei aus einem Verzeichnis (das Verzeichnis soll mittels Nutzerabfrage ermittelt werden)[machbar]
2. Einlesen des Schemas und Aufbau des XML-Baums [unklar]
3. Zeilenweiser Vergleich des Textes mit vorgegebenen regulären Ausdrücken [machbar, unklar bei Listen oder Absätzen innerhalb der <head>-Elemente von Unterpunkten und nummerierten Aufzählungen in Absätzen, vgl. Beispiel I.1. und II.1-3]
4. matchabhängige Zuweisung eines XML-Tags und Einordnung an der richtigen Stelle innerhalb der XML-Struktur [mittel xml.etree?, unklar]
5. Ausgabe in eine XML-Datei in ein Outputverzeichnis (ebenfalls per Nutzerabfrage) [machbar]
Zu 2.)
Ich könnte mittels xml.etree.ElementTree.SubElement die Struktur händisch aufbauen. Da das Schema allerdings komplexer ist, würde ich gerne den Dokumentenbaum/das Schema direkt einlesen, anstatt jedes Element einzeln erzeugen zu müssen. Geht das? Wenn ja, wie behandle ich Elemente, die auf verschiedenen Ebenen der XML-Struktur vorkommen können? vgl. unten <head>
Zu 3.)
Mein Problem ist hier vor allem im 2. und 3. Abschnitt der txt-Dateien, weil
a) Absätze in Untertiteln sich nicht durch Textmarken von einfachen Absätzen unterscheiden (beides beginnt jeweils mit Zeilenumbruch),
b) innerhalb von Absätzen, wenn Listen, wie die Unterüberschriften mit römischen Zahlen formatiert sind (im Gegensatz dazu kommen nur 4 verschiedene Titel vor und Untertitel beginnen immer mit einer römischen Ziffer).
zu a) Der Lösungsansatz wird hier vermutlich der Vergleich mit der Struktur des 1. Abschnitts liegen, in der nur die TOPs ohne Begleittext vorkommen, richtig? Vermutlich indem man den Textstream in die 3 Abschnitte splittet, die Struktur des ersten Teils für die beiden anderen übernimmt, Neues (im ersten Abschnitt nicht vorhandenes) entsprechend auszeichnet und danach wieder zusammensetzt.
zu b) Ich hatte überlegt hier die Behandlung anhand des parent-Elements zu steuern; sprich folgt eine Zeile mit dem Muster r"(\d\d?\.\s\V)" auf einen Absatz <p> ist es ein Listenelement <item>, ansonsten ist es der Untertitel <head> eines neue <div2>-Abschnitts. Allerdings folgen neue Untertitel bzw. <div2>-Abschnitte ja ebenfalls auf Absätze <p>. Also vermutlich eine ähnlich Lösung wie a)?
Auf stackoverflow habe ich eine Diskussion gefunden, die in etwa mein Problem behandelt, allerdings sind meine Dokument ungleich komplexer. Soweit ich es sehe. Ein Original kann ich leider nicht anhängen, da die Texte noch datenschutzrechtlichen Beschränkungen unterliegen, allerdings gibt es bereits veröffentlichte Beispiele hier, jedoch immer nur die Finalversion des Textes. In den txt-Dateien steht der Entwurf, eine kommentierte und die finale Version untereinander und soll auch entsprechend getaggt werden.
Die Struktur innerhalb einer txt-Datei entspricht:
Wobei maximal 4 Überschriften und eine maximal 2-stellige Zahl von Unterüberschriften existieren.Protokoll (Entwurf)
I. Überschrift
1. Unterüberschrift
2. Unterüberschrift
3. Unterüberschrift
II. Überschrift
1. Unterüberschrift
2. Unterüberschrift
Mit Umbruch
3. Unterüberschrift
a) mit
b) Listenpunkten
Protokoll (Einschätzung)
I. Überschrift
II. Überschrift
1. Unterüberschrift
Hier steht Text
2. Unterüberschrift
Mit Umbruch
Hier steht Text
3. Unterüberschrift
a) mit
b) Listenpunkten
a) Text zum Unterpunkt a
b) Text zum Unterpunkt b
Anhang
Anhang 1
Anhang 2
Hier steht Text
Protokoll (final)
I. Überschrift
1. Unterüberschrift
Hier steht Text
Mit einem zweiten Absatz
2. Unterüberschrift
Hier steht Text
3. Unterüberschrift
Hier steht Text
II. Überschrift
1. Unterüberschrift
Text mit Liste
- Eintrag
- Eintrag
- Eintrag
2. Unterüberschrift
Mit Umbruch
Hier steht Text
3. Unterüberschrift
a) mit
b) Listenpunkten
a) Text zum Unterpunkt a
b) Text zum Unterpunkt b
Anhang
Anhang 1 Teil1
Hier steht Text
Anhang 1 Teil2
1. Hier steht Text
2. in einer Liste
Und daraus sollte folgendes XML entstehen (nicht valide und nur die wichtigsten Dokumentenäste, Elemente die weniger häufig vorkommen sind nicht aufgenommen):
Code: Alles auswählen
<?xml>
<TEI @xmlns @xmlns:xsi @version @xml:id>
<teiHeader/>
<text n=“Entwurf“>....</text>
<text n=“Einschätzung“>....</text>
<text n=“Final“>
<front><head><title>Dokumententitel (final)</title><head></front>
<body>
<div1 n=“1“><head><title>I. Überschrift </title></head>
<div2 n=“1“><head>1. Unterüberschrift </head>
<p>Hier steht Text </p>
<p>mit einem zweiten Absatz</p>
<div2 n=“2“><head>2. Unterüberschrift</head></div2>
……
</div1>
<div1 n=“2“><head><title>II. Überschrift</title></head>
<div2 n=“1“><head>1. Unterüberschrift </head>
<p>Hier steht Text mit Liste
<item n=“1“>Eintrag</item>
<item n=“2“>Eintrag</item>
<item n=“3“>Eintrag</item></list></p></div2>
<div2 n=“2“><head>2. Unterüberschrift
<lb/>mit Umbruch</head>
<p/></div2>
<div2 n=“3“><head>3. Unterüberschrift
<list><item n=“1“>a) mit</item>
<item n=“1“>Listenpunkten</item></list></head>
<p><list><item n=“1“>a) Text zu a</item>
<item n=“2“>b) Text zu b</item></list></p></div2>
</body>
<back/>
<group> <!—Anhang 1-->
<text n=”1”> <!—Teil1-->
<front/>
<body/>
<back/>
<text/>
<text n=”2”> <!—Teil2-->
….</text>
</group>
</text></TEI>