Python解析XML存入SQLite需三步:先用xml.etree.ElementTree分析结构并提取字段(区分.get()取属性与.text取文本),再转为字典列表;然后用sqlite3建表(注意字段类型匹配);最后executemany()批量插入,兼顾安全与性能。

用Python解析XML并存入SQLite数据库,核心是三步:读取XML、提取数据、插入SQLite。关键在于结构化处理——XML格式多变,需先理清标签层级和字段映射关系,再用标准库(xml.etree.ElementTree)安全解析,避免第三方依赖;SQLite用sqlite3原生支持,无需额外安装。
1. 分析XML结构,明确要存的字段
比如有如下简化XML(books.xml):
Python编程 张三 59.9 数据结构 李四 45.5
目标字段是:id(属性)、title、author、price。注意id在book标签上,其余是子元素内容——解析时需区分.get()(取属性)和.text(取文本)。
2. 用ElementTree解析XML,转为Python字典列表
不建议直接逐节点拼SQL,先统一转成结构化数据更安全、易调试:
立即学习“Python免费学习笔记(深入)”;
Python v2.4版chm格式的中文手册,内容丰富全面,不但是一本手册,你完全可以把她作为一本Python的入门教程,教你如何使用Python解释器、流程控制、数据结构、模板、输入和输出、错误和异常、类和标准库详解等方面的知识技巧。同时后附的手册可以方便你的查询。
- 用
ET.parse()加载文件,或ET.fromstring()加载字符串 - 用
.findall("book")定位所有记录节点 - 对每个
book,用.get("id")取属性,.find("title").text等取子元素值 - 加
try/except防缺失字段(如某本书没),设默认值或跳过
示例代码片段:
import xml.etree.ElementTree as ET
tree = ET.parse("books.xml")
root = tree.getroot()
books = []
for book in root.findall("book"):
books.append({
"id": book.get("id"),
"title": book.find("title").text if book.find("title") is not None else None,
"author": book.find("author").text if book.find("author") is not None else None,
"price": float(book.find("price").text) if book.find("price") is not None else None,
})
3. 创建SQLite表并批量插入
表结构要匹配字段类型:id可设TEXT或INTEGER(若XML中全是数字),price用REAL,title/author用TEXT:
- 用
sqlite3.connect()连数据库(文件不存在会自动创建) -
cursor.execute()建表,注意加IF NOT EXISTS避免重复报错 - 用
executemany()批量插入,比循环execute()快得多,且自动处理SQL注入(参数化) - 别忘了
conn.commit()和conn.close()
接上例:
import sqlite3
conn = sqlite3.connect("library.db")
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS books (
id TEXT PRIMARY KEY,
title TEXT,
author TEXT,
price REAL
)
""")
cursor.executemany(
"INSERT OR REPLACE INTO books (id, title, author, price) VALUES (?, ?, ?, ?)",
[(b["id"], b["title"], b["author"], b["price"]) for b in books]
)
conn.commit()
conn.close()
4. 小心常见坑
编码问题:XML文件含中文时,确保用ET.parse("books.xml", parser=ET.XMLParser(encoding="utf-8"))显式指定编码。
空值与类型:XML中或空白标签会导致.text为None,转换float(None)会报错,务必提前判断。
特殊字符:ElementTree能自动处理&、等实体,不用手动解码。
大数据量:若XML超大(百MB以上),改用iterparse()边读边处理,避免内存爆满。









