sosci2word: Import eines Fragebogens ==================================== :Date: Mai 2023 _Import der Fragebogen-Definition von SoSci Survey in ein MS.Word-Dokument_ In diesem Sommer führt Daniela Zutavern (Nachbarin aus dem 3.Stock) für ihre Bachelor-Arbeit eine Umfrage durch zur psychischen Belastung von Physiotherapeuten am Arbeitsplatz. Dieser wird als Online-Fragebogen auf der Plattform https://www.soscisurvey.de/en/index[SoSci Survey] bereitgestellt -- muß dann aber für die Bachelor-Arbeit im Anhang der dokumentiert werden; da direkte Screenshots oder Konvertierungen des Online-Fragebogens (via PDF) problematisch sind, soll hier ein einfaches Python-Skript entwickelt werden, mit dem sich ein XML-Export aus der Fragebogen-Plattform einlesen und daraus eine Darstellung in ein Wort-Dokument schreiben läßt. Grundlage ist die Library https://pypi.org/project/python-docx/[Python-docx]. Konzept ------- Der Fragebogen liegt in strukturierter Form als *XML-Dokument* vor, und Inhalte können daher leicht mit Python eingelesen werden. Das *Python-docx*-Modul macht ein Word-Dokument neuen OOXML-Format zugängich als eine Folge von Absätzen, und zwar sowohl lesend, als auch schreibend. Als Vorbereitung kann im Word-Dokument bereits ein geeignetes Layout angelegt werden, so daß Inhalte als eine Folge von Absätzen eingefügt werden, und jeweils mit einer fest vereinbarten Formatvorlage verknüpft. Idealerweise sollten die Auswahlmöglichkeiten der einzelnen Items jeweils in einer eingebetteten Tabelle dargestellt werden -- sofern das Python-Modul dies zuläßt. Insgesamt handelt es sich um eine Einmal-Arbeit, die nicht zur Veröffentlichung vorgesehen ist; eine 80%-Lösung ist bereits mehr als genug. Format des SoSci-XML ~~~~~~~~~~~~~~~~~~~~ Es handelt sich um ein XML-Dokument mit DTD-Document-Type. Die Struktur gliedert sich in eine Sammlung von `
`-Elementen, in denen die einzelnen Items als `` aufgelistet sind. An diese Sequenz mit Inhalten schließt sich ein Element `` an, in das ein HTML-Template direkt eingebettet ist. Als letzter Abschnitt folgt ein Element ``, in dem aus den gesammelten Inhalten der konkrete Online-Fragebogen zusammengestellt wird. Dieser Abschnitt enthält eine Menge von Attributen im key/value-Format. Im Besonderen das Attribut `"content"` enthält ein verschachteltes XML-Dokument, eingebettet als XML-quoted text. Dieses verschachtelte Dokument listet eine Folge von ``-Elementen auf, welche wiederum jeweils eine Liste von ``-Elementen enthalten; diese referenzieren per ID auf die Definitionen und Inhalte für die einzelnen Items. Zusätzlich können weitere Seiteninhalte direkt als HTML-Elemente hinzugefügt werden, welche dann als CDATA eingebettet sind. Für die Generierung der Darstellung im Word-Format bietet es sich daher an, dieser Auflistung zu folgen, und die per ID referenzierten Elemente aus einem Dictionary zu entnehmen. Format der Word-Datei ~~~~~~~~~~~~~~~~~~~~~ Rohformat:: ein Zip-komprimiertes Archiv mit Ressourcen und XML-Dokumenten + besonders relevant: + - 'document.xml' : eigentlicher Inhalt des Dokuments - 'style.xml' : Platzhalter bzw konkrete Style-Definitionen (incl. Name-ID) logisches Format:: Metadaten + verschachtelte Sequenz von _Block_- und _Inline_-Elementen + - Block-Elemente sind: Paragraph, Table, Image, Drawing - Inline-Elemente sind: Run (=Text-Schnipsel mit einheitlichem Format), Table, Image, Frame + Sowohl Block-, alsauch Inline-Elemente sind direkt mit einem _Style_ ausgezeichnet. Dieser kann sowohl _direkte Formatierung_ umfassen, aber auch auf einen _definierten Style_ aus dem Stylesheet (``Formatvorlage'') per Name-ID verweisen. Implementierung --------------- Grundsätzlich ist eine einfache Implementierung möglich, indem das SoSci-XML gelesen, interpretiert und sofort in Word-Content transformiert wird. Es ergeben sich aber im Detail einige Schwierigkeiten - die Libarary python-docx kann zwar Wort-Format vollständig lesen und reproduzieren, aber nur wenige Basis-Features sind direkt über das API zur Manipulation zugänglich - zudem bietet python-docx nahezu keine Möglichkeit, ein bestehendes Dokument unbekannter Struktur zu analysieren. - wir brauchen relativ komplexe Tabellen-Formatierungen, die nur _ansatzweise dokumentiert_ sind. - der Fragebogen ist im SoSci-XML nicht sauber strukturell definiert, sondern nur als ein Template zur Darstellung. Lediglich die einzelnen Fragen sind als strukturierte Elemente definiert - die Referenzierung aus dem Darstellungs-Template erfolgt über interne IDs, welche aber in der strukturierten Definition lediglich kontextuell aufgebaut werden. Unser Code muß hier interpolieren. - das Darstellungs-Template ist ein verschachtelt eingebettetes weiteres XML-Dokument und zudem auch noch XML-quoted. - wir haben mehrere Item-Typen, mit einer jeweils anderen Datenstruktur => Polymorphismus NOTE: es ist mit den gegebenen Mitteln nicht möglich, das Tabellen-Styling zu steuern. Man könnte der ganzen Tabelle einen Style zuweisen, und man kann den Parahgraphs in jeder Zelle einen Style zuweisen (oder sie manuell formatieren). Jedoch kein Zugriff auf Rahmenarten, Cell-Alignment, Shading Verarbeitungs-Schema ~~~~~~~~~~~~~~~~~~~~ [yellow-background]#(dies ist der Plan zur Implementierung)#: Fragebogen-Definitionen können mit https://docs.python.org/3/library/xml.etree.elementtree.html[Elementtree] aus der Python-Standard-Library gelesen werden, das Word-Dokument mit https://python-docx.readthedocs.io/en/latest/index.html[python-docx(Documentation)]. Die Verarbeitung untergliedert sich in drei Phasen: 1. SoSci-Definitionen einlesen + * alle -Elemente aufsammeln * per Kontext die vollständige ID ablegen * daraus ein polymorphes Python-Objekt generieren * dies in eine Map-keyed-by-ID ablegen 2. SoSci-Questionaire verarbeiten + * das nested XML extrahieren und parsen * die Seitenstruktur navigieren * jedes konkret referenzierte Block-Element aus der Map holen * in eine mehrstufige Liste ablegen 3. Word-Content generieren + * das Word-Dokument öffnen * die mehrstufige Liste traversieren * auf jedem Block-Element eine polymorphe render(wordDocument)-Funktion aufrufen * Word-Dokument unter neuem Namen speichern Anwendung ~~~~~~~~~ Das eigentliche Python-Skript habe ich dann in einer einzigen ``Demo-Coding-Sitzung'' zusammen mit Daniela Zutavern entwickelt und getestet. Am Ende dieser Sitzung konnte ein Word-Dokument generiert werden, welches dann in das bereits bestehende Dokument für ihre Bachelor-Arbeit importiert wurde. Seitenumbrüche und Überschriften wurden sodann manuell formatiert und angeglichen. Zusammenfassend kann dieses kleine Projekt als Erfolg gewertet werden; es wurde viel Zeit bei der Aufbereitung der Arbeit gespart, und die eingebundenen Inhalte sind dargestellt in perfekter Qualität, ohne das Dokument nennenswert durch Grafik-Inhalte zu belasten. Die Erstellung der Bachelor-Arbeit war Anfang August 2023 abgeschlossen. Diese Abschlußarbeit wurde mit Note 1.7 bewertet.