2012-04-04 2 views
-1

PythonとLXMLを使用して、Mysqlクエリ結果からXMLファイルを作成しようとしています。ここに私が望む形式があります。PythonとlxmlでMySQLクエリからxmlを作成

 <DATA> 
     <ROW> 
      <FIELD1>content</FIELD1> 
      <FIELD2>content</FIELD2> 
     </ROW> 
    </DATA> 

何らかの理由で、コードが正しくフォーマットされていないため、XMLが検証されません。そのコードは

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() 

答えて

2

ここでは、lxmlを使用してxmlを構築する方法の小さな例を示します。

要素作成のヘルパー関数を作成すると便利です。ここでは簡単な関数を作成します。私はデモのためにダミーのカーソルオブジェクトを作成しました。

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) 

収量:

<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> 
+0

私は私の上に例を移植問題を抱えています。具体的には、タグにコンテンツを入れてください – user1130161

+0

私は便利なmysqlを持っていない。 'fetchall'によって返された各行が一連の値以外であれば、その行を一連の値に変換する必要があります。また、文字列以外の文字列の値を文字列に変換するために、ヘルパークラスを作成する必要があります。 – MattH

+0

渡されたコンテンツパラメータをUnicodeに変更しました。たとえば、ブール値をスキーマに応じて小文字で表す場合は、ブール値を小文字にするようにヘルパーを変更できます。 – MattH

関連する問題