【问题标题】:Creating xml from MySQL query with Python and lxml使用 Python 和 lxml 从 MySQL 查询创建 xml
【发布时间】:2012-04-04 13:32:21
【问题描述】:

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

【问题讨论】:

    标签: python mysql xml parsing lxml


    【解决方案1】:

    这是一个关于如何使用 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>
    

    【讨论】:

    • 我无法将您的示例移植到我的示例中。专门将内容放入标签中
    • 我手边没有 mysql。如果fetchall 返回的每一行都不是值序列,那么您需要将该行转换为值序列。此外,您可能需要充实 E 助手类以将非字符串内容值呈现为字符串
    • 我已经修改了帮助程序以对传递的内容参数进行 unicode。例如,您可能希望根据架构将布尔值表示为小写,因此您可以更改帮助程序以将布尔值呈现为小写。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-05
      • 2021-08-30
      • 2018-03-20
      • 2020-05-07
      • 2023-02-09
      相关资源
      最近更新 更多