2016-08-26 2 views
2

Я пытаюсь записать в xml-файл. Я изменил определенный элемент в моем коде и могу получить его для успешной печати. Мне нужно записать его в файл, не меняя структуру файла.
Мой код:Python, записывающий в xml-файл

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 

Когда я попробовать различные методы открытия и закрытия файла, он просто удаляет все данные в файле XML. Использование этого метода

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

Изменен код структуры моего файла как одна длинная строка.

+0

Есть красивые принтеры или инденторы в LXML. Одна длинная строка отлично подходит для xml. См. Этот вопрос http://stackoverflow.com/questions/749796/pretty-printing-xml-in-python – WombatPM

ответ

2

Если вы желаете, чтобы заменить значение в пределах существующего файла XML используйте:

tree.write(xmlfile) 

В настоящее время вы просто переписав файл целиком и используя неправильный метод (open()). tree.write() обычно то, что вы хотели бы использовать. Это может выглядеть примерно так:

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

Мне нужно было положить его внизу, и он работал безупречно – Anekdotin

2

Чтобы получить новые строки в выходном файле, похоже, что вам необходимо пройти pretty_print=True для вашей стерилизации().

Сторона примечания; Как правило, при открытии файлов с питоном вы открываете их, как это:

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

Этот путь есть меньше риск утечки дескрипторов файлов. Метод tree.write("filename.xml") выглядит как хороший и простой способ избежать обращения к файлу целиком.

+0

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

+0

Изменение на это приводит к тому, что файл создается в одну строку, а текст не заменяется – Anekdotin

+0

В приведенном выше фрагменте вы повторно сохраняете исходное дерево. См. Мой отредактированный ответ для проблемы новой строки. – pnovotnak