-1

我正在尝试使用 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()
4

2 回答 2

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>
于 2012-04-04T15:29:09.200 回答
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()
于 2020-02-13T22:42:46.260 回答