2016-05-23 20 views
0

Ich arbeite an einem kleinen Projekt, das ziemlich einfach sein sollte. Ich weiß, dass es schon einmal gemacht wurde, aber für das Leben von mir kann ich es nicht zur Arbeit bringen. Alles klar, also habe ich eine docx Vorlage mit Microsoft Word gemacht, die einen Header und nur etwas Text im Text des Papiers enthält. Mein Ziel ist ein Programm, das diesen Text ändern kann. Mit python-docx konnte ich erfolgreich ein Programm schreiben, das den Fließtext einfach modifiziert. Davon abgesehen versuche ich zu lernen, wie man das selbe durch XML-Parsing macht, wodurch der Header geändert werden kann. Lange Rede, kurzer Sinn, XML-Parsing (ich denke, das ist was es ist) wird mir viel mehr Freiheit auf der Straße geben.Bearbeiten einer DOCX-Datei

Ich weiß, nachdem das docx entpackt ist, enthält das Wort/document.xml den Nachrichtentext. Hier ist mein Code so weit.

from lxml import etree as ET 

tree = ET.parse('document.xml') 
root = tree.getroot() 

for i in root.iter('{http://schemas.openxmlformats.org/wordprocessingml/2006/main}t'): 
    if i.text == 'Title': 
     i.text = 'How to cook' 

tree.write('document_output.xml', xml_declaration = True, encoding = "UTF-8", method = "xml" \ 
, standalone = "yes") 

Dieses Programm ändert erfolgreich den gewünschten Text in den aktualisierten Text.

Hier ist das Original document.xml

https://www.dropbox.com/s/ghe1m176rdqtng7/document.xml?dl=0

Hier ist der Ausgang.

https://www.dropbox.com/s/8n9llagozbvb2mz/document_output.xml?dl=0

P. S. Wenn Sie den Code aus Dropbox anzeigen, beginnt alles in Zeile 4 statt in Zeile 1.

Wenn Sie sie in einem XML-Viewer anzeigen, können Sie sehen, dass sie identisch sind. Wenn Sie ein Textdifferenz-Werkzeug verwenden, ist der einzige Unterschied das geänderte Wort. Und ich würde nicht denken, dass dies wichtig wäre, aber die obere Zeile verwendet einfache Anführungszeichen anstelle von doppelten.

Hoffe jemand kann etwas Licht auf warum dies immer noch nicht richtig in Word öffnen.

Danke für die Hilfe !!

+0

Das erste Problem ist kein Problem: Namespace-Präfixe müssen nur deklariert werden, wenn sie verwendet werden, und die Präfixe selbst sind unbedeutend; Solange der zugehörige URI gleich ist, sind die Elemente mit Namespace gleichwertig.Was ist das zweite Problem, wenn überhaupt? Wird das erstellte Dokument wie erwartet in Word angezeigt? – kjhughes

+0

Wenn ich versuche, es in Word zu öffnen, heißt es, dass die Datei beschädigt ist. Ich nehme an, dass, damit es richtig geöffnet wird, alles bis auf den geänderten Text der ursprünglichen XML-Datei entsprechen sollte. Ich kann die XML-Datei im Editor öffnen und den Text gut editieren. Das funktioniert perfekt. Ich versuche nur, ein Python-Programm zu bekommen, um das durch XML-Parsing zu tun. –

+0

Es gibt viele Einschränkungen, die erfüllt sein müssen, damit eine DOCX-Datei gültig ist. Siehe zum Beispiel [Wo finde ich die XSDs von DOCX-XML-Dateien?] (Http://stackoverflow.com/questions/36428294/where-can-i-find-the-xsds-of-docx-xml-files). – kjhughes

Antwort

-1

Sie haben die üblichen Probleme mit ET. Als Vorspeise, sehen Sie sich diese Stackoverflow-Themen:

Wie Sie sehen können, sind Sie nicht der Erste, der mit diesen Probleme.

Was Sie für den Namespaces tun konnten, ist die XML analysieren zweimal:

  • erstes Mal, um die Namensräume zu extrahieren und
  • ein zweites Mal, um Ihre aktuelle Arbeit zu tun.

Außerdem haben bereits einige Leute vorgeschlagen, von Elementtree zu lxml zu wechseln.

+0

Ich habe oben Änderungen vorgenommen. Ich habe den Namespace-Fix ausprobiert und das Problem mit ns0 behoben. Immer noch eine beschädigte docx-Nachricht erhalten. –

+0

Hmm, ich kann hier nur raten: Du könntest 'utf-8' in 'UTF-8' ändern, was aber eigentlich kein Problem sein sollte. Andernfalls könnten Sie das Dokument im Vorher- und Nachher-Status bereitstellen oder ein Diff bereitstellen, damit das Problem leichter aufgespürt werden kann. – Michi

+0

Einen Schritt näher, damit das funktioniert. Auf meinem PC funktioniert das Programm einwandfrei. Ich benutzte mein Mac, um die neue Datei document.xml zu erstellen, und ich habe sie auf meinen PC verschoben und den Inhalt der docx-Datei mit der neuen Datei document.xml erneut gezippt. Überhaupt keine Probleme. Aber es funktioniert nicht auf meinem Mac. Ich mache dasselbe und Microsoft Word sagt, dass die Datei beschädigt ist. Muss etwas damit zu tun haben, wie Mac und PC Dateien komprimieren. Irgendwelche Ideen? –