XML (可扩展标记语言) 是一种用于存储和传输数据的标记语言。它被设计为自我描述且易于人类阅读和编写。在处理 XML 数据时,Python 提供了多种库来简化这一过程,比如 xml.etree.ElementTree、lxml 和 xml.dom.minidom 等。
XML 文件格式基础
一个简单的 XML 文档看起来像这样:
// www.javascriptcn.com code example
<?xml version="1.0"?>
<catalog>
<book id="bk101">
<author>Gambardella, Matthew</author>
<title>XML Developer's Guide</title>
<genre>Computer</genre>
<price>44.95</price>
<publish_date>2000-10-01</publish_date>
<description>An in-depth look at creating applications
with XML.</description>
</book>
</catalog>这个例子展示了几个关键点:
- XML 文档以
<?xml version="1.0"?>开头,表明这是一个 XML 文档。 - 每个元素由开始标签
<tag>和结束标签</tag>包围。 - 元素可以包含文本内容或子元素。
- 属性可以在开始标签中指定,如
<book id="bk101">。
使用 xml.etree.ElementTree 模块
ElementTree 是 Python 的标准库之一,它提供了一种简单的方式来解析和创建 XML 数据。
解析 XML 文件
首先,我们来看如何使用 ElementTree 解析一个 XML 文件:
import xml.etree.ElementTree as ET
tree = ET.parse('books.xml') # 假设你的 XML 文件名为 books.xml
root = tree.getroot()
print(root.tag) # 输出 'catalog'
for child in root:
print(child.tag, child.attrib)这段代码首先导入了 xml.etree.ElementTree 模块,并给它起了一个别名 ET。然后使用 ET.parse() 方法加载 XML 文件并返回一个树形结构的对象。通过调用 getroot() 方法获取文档的根元素,最后遍历根元素的所有子元素并打印它们的标签名和属性。
创建 XML 文件
创建 XML 文件同样简单:
// www.javascriptcn.com code example
from xml.etree.ElementTree import Element, SubElement, tostring
catalog = Element('catalog')
book = SubElement(catalog, 'book', attrib={'id': 'bk102'})
SubElement(book, 'author').text = 'Corets, Eva'
SubElement(book, 'title').text = 'Maeve Ascendant'
SubElement(book, 'genre').text = 'Fantasy'
SubElement(book, 'price').text = '5.95'
SubElement(book, 'publish_date').text = '2000-11-17'
SubElement(book, 'description').text = 'Another story about Maeve.'
xml_data = tostring(catalog)
print(xml_data.decode())这里我们创建了一个新的 catalog 元素作为根元素,并在其下添加了一个 book 子元素。通过 SubElement 函数可以方便地添加子元素和设置文本内容。最后使用 tostring() 将整个元素树转换为字符串表示形式。
使用 lxml 库进行更复杂的操作
虽然 ElementTree 已经非常强大,但 lxml 库提供了更多功能,例如 XPath 支持,这使得查找特定节点变得更加容易。
安装 lxml
要使用 lxml,你需要先安装它:
pip install lxml
使用 XPath 查询
XPath 是一种在 XML 文档中查找信息的语言。lxml 支持 XPath 表达式,可以让你轻松地从复杂的 XML 结构中提取所需的数据。
// www.javascriptcn.com code example
from lxml import etree
tree = etree.parse('books.xml')
root = tree.getroot()
# 找到所有 genre 为 'Computer' 的 book
computer_books = root.xpath("//book[genre='Computer']")
for book in computer_books:
print(book.find('title').text)这段代码使用 XPath 表达式 //book[genre='Computer'] 来查找所有 genre 属性值为 "Computer" 的 book 元素,并输出这些元素下的 title 子元素的文本内容。
总结
通过本章的学习,你应该已经掌握了基本的 XML 解析技巧,包括使用 ElementTree 和 lxml 库进行文件读写以及数据查询。在实际应用中,你可以根据需要选择合适的工具和技术来处理 XML 数据。