Background
I am using SQLite to access a database and retrieve the desired information. I'm using ElementTree in Python version 2.6 to create an XML file with that information.
Code
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")
Attempts
I've tried using tree.write("New_Database.xml", "utf-8")
in place of the last line of code above, but it did not edit the XML's layout at all – it's still a jumbled mess.
I also decided to fiddle around and tried doing:
tree = minidom.parseString(ET.tostring(root)).toprettyxml(indent = " ")
instead of printing this to the Python shell, which gives the error AttributeError: 'unicode' object has no attribute 'write'.
Questions
When I write my tree to an XML file on the last line, is there a way to pretty print to the XML file as it does to the Python shell?
Can I use toprettyxml()
here or is there a different way to do this?
Best Answer
Whatever your XML string is, you can write it to the file of your choice by opening a file for writing and writing the string to the file.
There is one possible complication, especially in Python 2, which is both less strict and less sophisticated about Unicode characters in strings. If your
toprettyxml
method hands back a Unicode string (u"something"
), then you may want to cast it to a suitable file encoding, such as UTF-8. E.g. replace the one write line with: