2016-08-26 8 views
2

Ich versuche, in eine XML-Datei zu schreiben. Ich habe ein bestimmtes Element in meinem Code geändert und kann es erfolgreich drucken. Ich muss es in die Datei geschrieben haben, ohne die Struktur der Datei zu ändern.
Mein Code:Python Schreiben in eine XML-Datei

import os 
from lxml import etree 


directory = '/Users/eeamesX/work/data/expert/EFTlogs/20160725/IT' 
XMLParser = etree.XMLParser(remove_blank_text=True) 
for f in os.listdir(directory): 
    if f.endswith(".xml"): 

     xmlfile = directory + '/' + f 



     tree = etree.parse(xmlfile, parser=XMLParser) 
     root = tree.getroot() 

     hardwareRevisionNode = root.find(".//hardwareRevision") 



     if hardwareRevisionNode.text == "5": 
      print " " 
      print "Old Tag: " + hardwareRevisionNode.text 

      x = hardwareRevisionNode.text = "DVT2" 

      print "New Tag " + hardwareRevisionNode.text 

Wenn ich verschiedene Methoden der Öffnung versuchen, die Datei zu schließen, es löscht nur alle Daten in der XML-Datei. Mit dieser Methode

outfile = open(xmlfile, 'w') 
oufile.write(etree.tostring(tree)) 
outfile.close() 

Die Codestruktur meiner Datei geändert, um eine lange Zeile zu sein.

+0

ziemlich Drucker oder Eindringkörper in lxml Es gibt keine. Ein langer String ist perfekt gültiges XML. Siehe diese Frage http://stackoverflow.com/questions/749796/pretty-printing-xml-in-python – WombatPM

Antwort

2

Wenn Sie wollen, einen Wert innerhalb einer bestehenden XML-Datei dann ersetzen verwenden:

tree.write(xmlfile) 

Derzeit sind Sie einfach Ihre Datei vollständig und mit der falschen Methode (open()) überschrieben werden. tree.write() ist normalerweise das, was Sie verwenden möchten. Es könnte wie folgt aussehen:

tree = etree.parse(xmlfile, parser=XMLParser) 
root = tree.getroot() 
hardwareRevisionNode = root.find(".//hardwareRevision") 
if hardwareRevisionNode.text == "5": 
    print "Old Tag: " + hardwareRevisionNode.text 
    hardwareRevisionNode.text = "DVT2" 
    print "New Tag: " + hardwareRevisionNode.text 
    tree.write(xmlfile) 

https://docs.python.org/2/library/xml.etree.elementtree.html

+0

Ich musste es auf den Boden stellen und es funktionierte einwandfrei – Anekdotin

2

Um Zeilenumbrüche in der Ausgabedatei zu erhalten, müssen Sie wie folgt vorgehen: pretty_print=True an Ihren Sterilisations-Anruf (write oder tostring) übergeben.

Seitennotiz; Normalerweise, wenn Sie Dateien öffnen, mit Python Sie sie wie folgt geöffnet:

with open('filename.ext', 'mode') as myfile: 
    myfile.write(mydata) 

Auf diese Weise besteht ein geringeres Risiko von Dateideskriptor Lecks. Die Methode tree.write("filename.xml") sieht wie eine nette und einfache Möglichkeit aus, den Umgang mit der Datei vollständig zu vermeiden.

+0

tree = etree.parse (Xmlfile, Parser = XMLParser) root = tree.getroot() tree.write() xmlfile) hardwareRevisionNode = root.find (".// hardwareRevision") – Anekdotin

+0

Wenn Sie dies ändern, wird die Datei in eine Zeile umgewandelt und der Text wird nicht ersetzt. – Anekdotin

+0

Im obigen Snippet speichern Sie den ursprünglichen Baum erneut. Siehe meine bearbeitete Antwort für das Newline-Problem. – pnovotnak