I am trying to use Python and LXML to create an XML file from a Mysql query result. Here is the format I want.
<DATA>
<ROW>
<FIELD1>content</FIELD1>
<FIELD2>content</FIELD2>
</ROW>
</DATA>
For some reason the code isn't formatting right and the XML will not validate. Here is that code
from lxml import etree
from lxml.etree import tostring
from lxml.builder import E
import MySQLdb
try:
conn = MySQLdb.connect(host = 'host',user = 'user',passwd = 'pass',db = 'db')
cursor = conn.cursor()
except:
sys.exit(1)
cursor.execute("SELECT * FROM db.table")
columns = [i[0] for i in cursor.description]
allRows = cursor.fetchall()
xmlFile = open("mysqlxml.xml","w")
xmlFile.write('<DATA>')
for rows in allRows:
xmlFile.write('<ROW>')
columnNumber = 0
for column in columns:
data = rows[columnNumber]
if data == None:
data = ''
xmlFile.write('<%s>%s</%s>' % (column,data,column))
columnNumber += 1
xmlFile.write('</ROW>')
xmlFile.write('</DATA>')
xmlFile.close()
Here's a little example of how you can build xml using lxml.
It's useful to create a helper function for element creation, here's a simple one. I've created a dummy cursor object for demo purposes.
from lxml import etree
from lxml.builder import E as buildE
class DummyCursor(object):
def __init__(self,fields,rows=5):
self.description = [[f] for f in fields]
self.data = [ ["%s%02d" % (f,i) for f in fields] for i in range(rows) ]
def fetchall(self):
return self.data
def E(tag,parent=None,content=None):
"""Simple E helper"""
element = buildE(tag)
if content is not None:
element.text = unicode(content)
if parent is not None:
parent.append(element)
return element
def fetchXML(cursor):
fields = [x[0] for x in cursor.description ]
doc = E('data')
for record in cursor.fetchall():
r = E('row',parent=doc)
for (k,v) in zip(fields,record):
E(k,content=v,parent=r)
return doc
doc = fetchXML(DummyCursor(['name','description']))
print etree.tostring(doc,pretty_print=True)
Yields:
<data>
<row>
<name>name00</name>
<description>description00</description>
</row>
<row>
<name>name01</name>
<description>description01</description>
</row>
<row>
<name>name02</name>
<description>description02</description>
</row>
<row>
<name>name03</name>
<description>description03</description>
</row>
<row>
<name>name04</name>
<description>description04</description>
</row>
</data>