Python3 XML 解析
在 Python3 中,解析和处理 XML 文件可以通过多个模块来实现,最常用的模块是 xml.etree.ElementTree 和 lxml。下面将详细解析如何使用 Python3 进行 XML 解析。
1. 使用 xml.etree.ElementTree 解析 XML
xml.etree.ElementTree 是 Python 标准库的一部分,它提供了简单的 API 来处理 XML 文档。这个模块适合处理不太复杂的 XML 文件。
1.1 解析 XML 文件
import xml.etree.ElementTree as ET
# 解析 XML 文件
tree = ET.parse("example.xml") # 加载 XML 文件
root = tree.getroot() # 获取 XML 根元素
# 打印根元素的标签
print("Root element:", root.tag)
# 遍历所有子元素
for child in root:
print(child.tag, child.attrib)
1.2 解析字符串中的 XML
如果你有一个 XML 字符串而不是文件,可以使用 fromstring() 方法直接解析。
import xml.etree.ElementTree as ET
# XML 字符串
xml_data = """
<library>
<book>
<title>Python Programming</title>
<author>John Doe</author>
</book>
<book>
<title>XML Parsing in Python</title>
<author>Jane Smith</author>
</book>
</library>
"""
# 解析 XML 字符串
root = ET.fromstring(xml_data)
# 打印 XML 元素
for book in root.findall("book"):
title = book.find("title").text
author = book.find("author").text
print(f"Title: {title}, Author: {author}")
1.3 创建 XML 文档
xml.etree.ElementTree 也支持创建新的 XML 文档。
import xml.etree.ElementTree as ET
# 创建根元素
root = ET.Element("library")
# 创建子元素
book1 = ET.SubElement(root, "book")
title1 = ET.SubElement(book1, "title")
title1.text = "Python Programming"
author1 = ET.SubElement(book1, "author")
author1.text = "John Doe"
# 创建 ElementTree 对象
tree = ET.ElementTree(root)
# 保存到文件
tree.write("output.xml")
1.4 查找元素
find(): 查找第一个匹配的元素。findall(): 查找所有匹配的元素。iter(): 遍历整个树的元素。
# 查找第一个匹配的元素
title = root.find(".//title").text # 使用 XPath 表达式查找
print("First title:", title)
# 查找所有书籍元素
books = root.findall("book")
for book in books:
print(book.find("title").text)
1.5 修改 XML 内容
可以修改元素的文本内容或属性。
# 修改元素的文本内容
first_book = root.find("book")
first_book.find("title").text = "Advanced Python Programming"
# 修改元素的属性
first_book.set("year", "2021")
# 保存修改后的 XML
tree.write("modified.xml")
2. 使用 lxml 解析 XML
lxml 是一个功能更强大的库,支持 XPath 和 XSLT 等高级功能。与 xml.etree.ElementTree 相比,lxml 提供了更多的特性和更高效的性能,尤其适用于大型 XML 文件。
2.1 安装 lxml
pip install lxml
2.2 解析 XML 文件
from lxml import etree
# 解析 XML 文件
tree = etree.parse("example.xml")
root = tree.getroot()
# 打印根元素标签
print("Root element:", root.tag)
# 遍历所有子元素
for child in root:
print(child.tag, child.attrib)
2.3 使用 XPath 查找元素
lxml 支持 XPath,可以更方便地查找复杂的元素。
from lxml import etree
# 解析 XML
tree = etree.parse("example.xml")
root = tree.getroot()
# 使用 XPath 查找所有书籍标题
titles = root.xpath("//book/title/text()")
for title in titles:
print("Title:", title)
2.4 创建和修改 XML 文档
与 xml.etree.ElementTree 类似,lxml 也支持创建和修改 XML 文档。
from lxml import etree
# 创建 XML 元素
root = etree.Element("library")
book1 = etree.SubElement(root, "book")
title1 = etree.SubElement(book1, "title")
title1.text = "Python Programming"
author1 = etree.SubElement(book1, "author")
author1.text = "John Doe"
# 创建 XML 树并写入文件
tree = etree.ElementTree(root)
tree.write("output_lxml.xml", pretty_print=True)
2.5 修改 XML 内容
from lxml import etree
# 解析 XML
tree = etree.parse("example.xml")
root = tree.getroot()
# 修改书籍标题
first_book = root.find(".//book")
first_book.find("title").text = "Advanced Python Programming"
# 保存修改后的 XML
tree.write("modified_lxml.xml", pretty_print=True)
3. 处理 XML 属性
XML 元素可以有属性,xml.etree.ElementTree 和 lxml 都支持访问和修改属性。
# 使用 xml.etree.ElementTree
root = ET.Element("library")
book = ET.SubElement(root, "book", year="2021")
book.set("author", "John Doe")
print(book.attrib) # 打印属性
# 使用 lxml
book = etree.Element("book", year="2021", author="John Doe")
print(book.attrib) # 打印属性
4. 处理 XML 命名空间
XML 命名空间(namespace)用于避免元素名称的冲突。如果 XML 中包含命名空间,需要特别处理。
import xml.etree.ElementTree as ET
xml_data = """
<ns:library xmlns:ns="http://example.com/ns">
<ns:book>
<ns:title>Python Programming</ns:title>
<ns:author>John Doe</ns:author>
</ns:book>
</ns:library>
"""
root = ET.fromstring(xml_data)
# 使用命名空间查找元素
namespaces = {"ns": "http://example.com/ns"}
title = root.find(".//ns:title", namespaces).text
print("Title:", title)
5. 总结
xml.etree.ElementTree:适用于简单的 XML 解析任务,提供了基本的 API,操作起来比较方便。lxml:功能更强大,支持 XPath、XSLT 等高级功能,适合处理复杂或大型的 XML 文档。- 在解析 XML 文件时,可以选择基于元素标签或者属性来查找所需内容,
lxml提供了更多的灵活性,尤其在进行 XPath 查询时。 - 解析 XML 后,你可以方便地修改 XML 内容,并将结果写入文件。
更多详细内容请关注其他相关文章!