有没有更好的解决方案,或者我将数据解析为数据库的方式很好?

时间:2017-01-15 19:26:07

标签: python xml-parsing

我是编程和Python的新手。在学习python的过程中,我正在完成所有的问题集和练习,但也在开发自己的项目来帮助我学习。

我在项目中需要做的一些事情我们没有详细介绍,所以我一直在做额外的研究。虽然下面的代码运行良好,但我不确定这是否是实现它的正确方法。

基本上,我正在解析一个小于10KB的小型XML文件。我遍历文件,只复制四个字段及其值。然后我将这些值插入到临时sqlite DB中,以便我进一步操作并添加更多字段或更改数据。

所以我想,不是编写两个单独的函数,一个是解析XML文件,另一个是更新数据库,我可以使用一个小函数同时执行这两个函数,因为xml文件非常小而且我并不担心性能。

因此,当一个循环完成查找我需要的数据时,我的循环更新DB同时进行。

以下是我目前正在使用的代码。但如果不是这样的话,我不想使用它。如果我能帮助它,就不要学习任何坏习惯。

import xml.etree.cElementTree as ET
import sqlite3

def parseCT(self):
    """
    Read data from XML File.
    Parse XML data and insert data into Temp DB file
    """

    # Open XML file so we can access data
    tree = ET.ElementTree(file='acs.xml')
    root = tree.getroot()

    # Create temp DB to store read XML data
    con = sqlite3.connect('ct_temp.db')
    cur = con.cursor()
    cur.execute('''CREATE TABLE XMLTable (
                ID TEXT NOT NULL, Description TEXT,
                VariableType TEXT, Text TEXT,
                PRIMARY KEY (ID))''')
    con.commit() # update and save changes to our temp DB.

    txt1 = ''
    txt2 = ''
    txt3 = ''
    txt4 = ''

    # Loop to find the elements we are looking for
    for elem in tree.iter():
        if elem.tag == 'ID':
            txt1 = elem.text  
        elif elem.tag == 'Description':
            txt2 = elem.text
        elif elem.tag == 'VariableType':
            txt3 = elem.text
        elif elem.tag == 'Text':
            txt4 = elem.text

    cur.execute('INSERT INTO XMLTable VALUES (?, ?, ?, ?)',
                (txt1, txt2, txt3, txt4))
    con.commit()
    con.close()

2 个答案:

答案 0 :(得分:1)

使用findtext

cur.execute('INSERT INTO XMLTable VALUES (?, ?, ?, ?)',
            (root.findtext('ID'), root.findtext('Description'),
             root.findtext('VariableType'), root.findtext('Text')))

答案 1 :(得分:0)

假设您的代码有效,为了简化代码,您可以这样做:

# Initial list to maintain the order of params in `INSERT` statement
query_params_order = ['ID', 'Description', 'VariableType', 'Text']

# `.format` will replace `{}` in query based on the order of params in `list`
cur.execute('''CREATE TABLE XMLTable (
            {} TEXT NOT NULL, {} TEXT,
            {} TEXT, {} TEXT,
            PRIMARY KEY (ID))'''.format(*query_params_order))

con.commit()

# `dict` with tag and text mapping
params_dict = {elem.tag: elem.text for elem in tree.iter()}

order_params = [params_dict.get(param, '') for param in query_params_order]

cur.execute('INSERT INTO XMLTable VALUES (?, ?, ?, ?)',
            order_params)

而不是:

cur.execute('''CREATE TABLE XMLTable (
            ID TEXT NOT NULL, Description TEXT,
            VariableType TEXT, Text TEXT,
            PRIMARY KEY (ID))''')
con.commit() # update and save changes to our temp DB.

txt1 = ''
txt2 = ''
txt3 = ''
txt4 = ''

# Loop to find the elements we are looking for
for elem in tree.iter():
    if elem.tag == 'ID':
        txt1 = elem.text  
    elif elem.tag == 'Description':
        txt2 = elem.text
    elif elem.tag == 'VariableType':
        txt3 = elem.text
    elif elem.tag == 'Text':
        txt4 = elem.text

cur.execute('INSERT INTO XMLTable VALUES (?, ?, ?, ?)',
            (txt1, txt2, txt3, txt4))

它的行为与您的代码相同,但更加干净和可扩展。