我有问题。我需要解析多个xml文件并将数据插入数据库。
import os
from lxml import etree
import sqlite3
conn = sqlite3.connect("xml.db")
cursor = conn.cursor()
path = 'C:/tools/XML'
for filename in os.listdir(path):
fullname = os.path.join(path, filename)
tree = etree.parse(fullname)
test = tree.xpath('//*[@name="Name"]/text()')
tpl = tuple(test)
cursor.executemany("INSERT INTO parsee VALUES (?);", (tpl,))
conn.commit()
sql = "SELECT * FROM parsee"
cursor.execute(sql)
print(cursor.fetchall())
结果:
[('testname1',)]
如果我再次运行该程序,该程序将添加另一个相同的名称。结果:
[('testname1',),('testname1',)]
文件夹中有100个文件:
<curent name="Name">testname1<curent>
<curent name="Name">testname2<curent>
<curent name="Name">testname3<curent>
<curent name="Name">testname4<curent>
答案 0 :(得分:0)
由于我没有在计算机上安装lxml的管理员权限,因此我将使用默认情况下Python附带的电池(类)来处理XPATH- xml.etree.ElementTree 。但是,我的代码将向您展示如何使用executemany()在SQLITE中插入多个记录
在C:/ tools / XML中,您将看到许多具有相同结构的xml文件。 我将以下两个放在文件夹中以模拟此情况(我注意到您的示例以“ curent”作为元素,不确定是不是错字,我使用的是“ current”)
file1.xml
<note>
<current name="Name">testname1</current>
<current name="Name">testname2</current>
<otherdetail></otherdetail>
</note>
file2.xml
<note>
<current name="Name">testname3</current>
<current name="Name">testname4</current>
<otherdetail></otherdetail>
</note>
使用以下语句创建了一个名为xml.db的sqlite数据库用例,并在其中创建了一个表
CREATE TABLE PARSEE (NAME VARCHAR(100));
这是我的python脚本
import os
import xml.etree.ElementTree as ET
import sqlite3
conn = sqlite3.connect("xml.db")
cursor = conn.cursor()
path = 'C:/tools/XML'
for filename in os.listdir(path):
fullname = os.path.join(path, filename)
print("Parsing file: %s" %fullname)
tree = ET.parse(fullname)
root = tree.getroot()
elements = root.findall(".//*[@name='Name']");
names = [(e.text,) for e in elements]
print("Names found: %s" %names)
cursor.executemany("INSERT INTO PARSEE VALUES (?)", names)
conn.commit()
sql = "SELECT * FROM PARSEE"
print("Printing table PARSEE content")
cursor.execute(sql)
print(cursor.fetchall())
这是输出