我正在尝试使用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()
答案 0 :(得分: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>
答案 1 :(得分:0)
在AWS s3存储桶中使用Python和lxml从MySQL查询创建或更新XML。
#--编码:utf-8--
from xml.etree import ElementTree
import json, pymysql, requests
import boto3
from boto3.s3.transfer import S3Transfer
BD = 'bd'
HOST = 'host'
USER = 'user'
PASS = 'pass'
HEADERS = {"Content-Type" : "application/json"}
AWS_ACCESS_KEY_ID = 'value_access_key'
AWS_SECRET_ACCESS_KEY = 'value_sercret_access_key'
def updateXMLFunction():
db = pymysql.connect(HOST,USER,PASS,BD)
cursor = db.cursor()
SQL = "SELECT * FROM table_name"
cursor.execute(SQL)
resp = {
"response": {
"message" : "",
"estatus" : "",
}
}
s3 = boto3.resource('s3',
aws_access_key_id=AWS_ACCESS_KEY_ID,
aws_secret_access_key= AWS_SECRET_ACCESS_KEY)
bucket = s3.Bucket('name_carpet_bucket')
object = bucket.Object('filename_heresavetheresult.xml')
columns = [i[0] for i in cursor.description]
allRows = cursor.fetchall()
Document = ElementTree.Element("Document")
try:
for rows in allRows:
Row = ElementTree.SubElement(Document, "Row")
columnNumber = 0
for column in columns:
data = rows[columnNumber]
if data == None:
data = ''
data = str(data).replace('&', '\&')
columnas = ('<%s>%s</%s>' % (column,data,column))
ElementTree.SubElement(Row, column).text = data
columnNumber += 1
xmlstr = ElementTree.tostring(Document, encoding='utf8', method='xml')
# print(xmlstr)
object.put(Body=xmlstr, ACL='public-read')
resp["response"]["message"] = "Se ha creado el XML correctamente"
resp["response"]["estatus"] = "updated"
print(json.dumps(resp, indent=4, sort_keys=True))
return resp
except Exception as e:
resp["response"]["message"] = e
resp["response"]["estatus"] = "error"
# print(json.dumps(resp, indent=4, sort_keys=True))
return resp
updateXMLFunction()