一、常用 xml 处理库简介
- xml.etree.elementtree
- python 标准库,轻量级,适合基础操作。
- lxml
- 第三方高性能库,支持 xpath、xslt 和 schema 验证。
- xml.dom / xml.sax
- 标准库实现,适合处理大型 xml 或事件驱动解析。
- 辅助工具库
xmltodict(xml ↔ 字典)、untangle(xml → python 对象)等。
二、xml.etree.elementtree 详解
1. 解析 xml
import xml.etree.elementtree as et
# 从字符串解析
root = et.fromstring("<root><child>text</child></root>")
# 从文件解析
tree = et.parse("file.xml")
root = tree.getroot()
2. 数据查询与修改
# 遍历子元素
for child in root:
print(child.tag, child.attrib)
# 查找元素
element = root.find("child")
element.text = "new_text" # 修改文本
element.set("attr", "value") # 修改属性
3. 生成与保存 xml
root = et.element("root")
child = et.subelement(root, "child", attrib={"key": "value"})
child.text = "content"
tree = et.elementtree(root)
tree.write("output.xml", encoding="utf-8", xml_declaration=true)
三、lxml 库高级操作
1. xpath 查询
from lxml import etree
tree = etree.parse("file.xml")
elements = tree.xpath("//book[price>20]/title/text()") # 查询价格>20的书名
2. xml schema 验证
schema = etree.xmlschema(etree.parse("schema.xsd"))
parser = etree.xmlparser(schema=schema)
try:
etree.parse("data.xml", parser)
except etree.xmlschemaerror as e:
print("验证失败:", e)
四、xml 与 excel 互转
1. xml → excel (xlsx)
from openpyxl import workbook
import xml.etree.elementtree as et
tree = et.parse("books.xml")
root = tree.getroot()
wb = workbook()
ws = wb.active
ws.append(["书名", "作者", "价格"])
for book in root.findall("book"):
title = book.find("title").text
author = book.find("author").text
price = book.find("price").text
ws.append([title, author, price])
wb.save("books.xlsx")
2. excel (xlsx) → xml
from openpyxl import load_workbook
import xml.etree.elementtree as et
def xlsx_to_xml(input_file, output_file):
wb = load_workbook(input_file)
ws = wb.active
root = et.element("bookstore")
headers = [cell.value.strip() for cell in ws[1]]
for row in ws.iter_rows(min_row=2, values_only=true):
book = et.subelement(root, "book")
for idx, value in enumerate(row):
tag = et.subelement(book, headers[idx])
tag.text = str(value)
et.elementtree(root).write(output_file, encoding="utf-8", xml_declaration=true)
xlsx_to_xml("books.xlsx", "books_from_excel.xml")
五、xml 与数据库交互
存储到 sqlite
import sqlite3
import xml.etree.elementtree as et
conn = sqlite3.connect("books.db")
cursor = conn.cursor()
cursor.execute("create table if not exists books (title text, author text, price real)")
tree = et.parse("books.xml")
for book in tree.findall("book"):
title = book.find("title").text
author = book.find("author").text
price = float(book.find("price").text)
cursor.execute("insert into books values (?, ?, ?)", (title, author, price))
conn.commit()
conn.close()
六、xml 与 json 互转
1. xml → json
import xmltodict
import json
with open("books.xml") as f:
xml_data = f.read()
data_dict = xmltodict.parse(xml_data)
with open("books.json", "w") as f:
json.dump(data_dict, f, indent=4, ensure_ascii=false)
2. json → xml
import xmltodict
import json
with open("books.json") as f:
json_data = json.load(f)
xml_data = xmltodict.unparse(json_data, pretty=true)
with open("books_from_json.xml", "w") as f:
f.write(xml_data)
七、性能优化与常见问题
1. 性能建议
- 小型数据: 使用
xml.etree.elementtree。 - 大型数据: 使用
lxml的iterparse流式解析。 - 内存敏感场景: 使用
xml.sax事件驱动解析。
2. 常见问题解决
处理命名空间:
# lxml 示例
namespaces = {"ns": "http://example.com/ns"}
elements = root.xpath("//ns:book", namespaces=namespaces)
特殊字符处理:
element.text = et.cdata("<特殊字符>&")
依赖安装
pip install lxml openpyxl xmltodict
输入输出示例
- xml 文件 (
books.xml)
<bookstore>
<book>
<title>python编程</title>
<author>john</author>
<price>50.0</price>
</book>
</bookstore>
- json 文件 (
books.json)
{
"bookstore": {
"book": {
"title": "python编程",
"author": "john",
"price": "50.0"
}
}
}
通过本指南,可快速实现 xml 与其他格式的互转、存储及复杂查询操作,满足数据迁移、接口开发等多样化需求。
到此这篇关于python xml自动化处理全攻略分享的文章就介绍到这了,更多相关python xml自动化处理内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论