2015-03-02 3 views
14

Фон

Я использую SQLite для доступа к базе данных и получения требуемой информации. Я использую ElementTree в Python версии 2.6 для создания XML-файла с этой информацией.Как получить ElementTree Python для печати в XML-файле?

Код

import sqlite3 
import xml.etree.ElementTree as ET 

# NOTE: Omitted code where I acccess the database, 
# pull data, and add elements to the tree 

tree = ET.ElementTree(root) 

# Pretty printing to Python shell for testing purposes 
from xml.dom import minidom 
print minidom.parseString(ET.tostring(root)).toprettyxml(indent = " ") 

####### Here lies my problem ####### 
tree.write("New_Database.xml") 

Попытки

Я попытался с помощью tree.write("New_Database.xml", "utf-8") вместо последней строки кода выше, но не редактировать раскладку языка XML вообще - это все перемешаны беспорядок.

Я также решил поиграться вокруг и пытался делать:
tree = minidom.parseString(ET.tostring(root)).toprettyxml(indent = " ")
вместо печати это оболочки Python, что дает ошибку AttributeError: «юникода» объект не имеет атрибута «писать».

Вопросы

Когда я пишу мое дерево в файл XML на последней строке, есть способ довольно печать в файл XML, как это делает в оболочку Python?

Могу ли я использовать toprettyxml() здесь или есть другой способ сделать это?

ответ

19

Независимо от вашей строки XML, вы можете записать ее в файл по вашему выбору, открыв файл для записи и записи строки в файл.

from xml.dom import minidom 

xmlstr = minidom.parseString(ET.tostring(root)).toprettyxml(indent=" ") 
with open("New_Database.xml", "w") as f: 
    f.write(xmlstr) 

Существует один из возможных осложнений, особенно в Python 2, который является одновременно менее строгим и менее сложным о символах Unicode в строках. Если ваш метод toprettyxml вернет строку Unicode (u"something"), вы можете отправить ее в подходящую кодировку файла, такую ​​как UTF-8. Например. заменить строку одна запись с:

f.write(xmlstr.encode('utf-8')) 
+0

Этот ответ был бы более ясным, если бы вы включили инструкцию 'import xml.dom.minidom as minidom', которая представляется необходимой. –

+0

@KenPronovici Возможно. Это импорт появляется в исходном вопросе, но я добавил его здесь, поэтому нет путаницы. –

+0

Этот ответ повторяется так часто по любым вопросам, но это не что иное, как хороший ответ: вам нужно полностью преобразовать все дерево XML в строку, переписать его, чтобы снова распечатать, на этот раз совсем иначе. Это не очень хороший подход. Используйте lxml вместо этого и сериализуйте напрямую, используя встроенный метод, предоставляемый lxml, таким образом устраняя любую промежуточную печать, за которой следует повторная обработка. –

3

Установите bs4

pip install bs4 

Используйте этот код для симпатичной печати:

from bs4 import BeautifulSoup 

x = your xml 

print(BeautifulSoup(x, "xml").prettify()) 
+0

Это хорошее решение, когда мы не хотим писать XML в файл. – FearlessFuture

1

Посмотрите на vkbeautify модуля.

Ввод и вывод могут быть строковыми/файлами в любых комбинациях. Он очень компактный и не имеет никакой зависимости.

import vkbeautify as vkb 

a) pretty_text = vkb.xml(your_xml_text) #return String 

b) vkb.xml(your_xml_text, 'path/to/dest/file') #save in file 
+0

Я установил это, и я получаю 'ValueError: stat: путь слишком длинный для Windows 'всякий раз, когда я пытаюсь запустить, я предполагаю, потому что мой XML длиннее ограничения Windows на 255 символов, и он пытается увидеть, является ли мой XML входным путь до его обработки. –