我是编程和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()
答案 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))
它的行为与您的代码相同,但更加干净和可扩展。