下面我将为你详细讲解“Python解析XML模块封装代码”的完整攻略。
1. 什么是XML?
XML全称Extensible Markup Language,即可扩展标记语言。XML是一种用于存储和传输数据的标记语言,常被作为各种数据格式的基础,如HTML、RSS、Atom等。
2. Python中解析XML的模块
Python提供了多种方式来解析XML,并支持多种XML解析库,例如:
minidom
:Python自带的库,适合小型文件,但相对较慢。SAX
:基于事件驱动的解析器,适合大型文件,但需要自己编写处理代码。ElementTree
:Python自带的库,使用简单方便,适用于大部分情况。
本文将以ElementTree
模块为例,讲解XML的解析过程。
3. 解析XML的三个步骤
使用ElementTree
解析XML文件通常要经过三个步骤:
- 加载XML文件:将XML文件读入内存中,生成一个ElementTree对象。
- 获取根节点:从ElementTree对象中获取根节点。
- 处理XML数据:针对XML文件的结构,将XML数据进行处理。
下面通过两个示例来详细讲解这三个步骤。
示例一:解析XML文件并输出所有book的title
假设有一个名为books.xml
的XML文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<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>
<book id="bk102">
<author>Ralls, Kim</author>
<title>Midnight Rain</title>
<genre>Fantasy</genre>
<price>5.95</price>
<publish_date>2000-12-16</publish_date>
<description>A former architect battles corporate zombies,
an evil sorceress, and her own childhood to become queen
of the world.</description>
</book>
<!-- 其他book -->
</catalog>
下面的Python代码演示了读入XML文件、获取根节点、遍历XML文件中所有的book
元素,并输出它们的title
标签值。
import xml.etree.ElementTree as ET
# 加载XML文件
tree = ET.parse('books.xml')
# 获取根节点
root = tree.getroot()
# 遍历所有book元素,输出它们的title标签值
for book in root.iter('book'):
title = book.find('title').text
print(title)
程序的运行结果如下:
XML Developer's Guide
Midnight Rain
示例二:解析XML字符串并输出节点属性
下面的Python代码演示了如何使用ElementTree
解析XML字符串,并输出节点的属性:
import xml.etree.ElementTree as ET
# XML字符串
xmlstr = '''<people>
<person age="28" sex="male" name="Tom">Tom is a man.</person>
<person age="24" sex="female" name="Lucy">Lucy is a woman.</person>
</people>'''
# 从字符串中加载XML文件
root = ET.fromstring(xmlstr)
# 遍历所有person元素,输出它们的属性
for person in root.findall('./person'):
name = person.get('name')
age = person.get('age')
sex = person.get('sex')
print('{} is a {} years old {}.'.format(name, age, sex))
程序的运行结果如下:
Tom is a 28 years old male.
Lucy is a 24 years old female.
4. 封装XML解析代码
我们可以将上述的XML解析代码封装成一个函数,这样我们就可以在程序中方便地调用它。
下面的Python代码演示了一个简单的封装:
import xml.etree.ElementTree as ET
def parse_xml(xml_str, node_name, attr_list, tag_list):
"""
解析XML字符串,并按指定节点名、属性和标签列表进行过滤
"""
root = ET.fromstring(xml_str)
nodes = root.findall(node_name)
result = []
for node in nodes:
# 判断节点是否符合条件
if all(node.get(attr, None) for attr in attr_list) and \
all(node.find(tag) is not None for tag in tag_list):
# 符合条件则将其加入结果列表中
result.append(node)
return result
这个函数接受四个参数:
xml_str
:待解析的XML字符串。node_name
:要过滤的节点的名称。attr_list
:要过滤的节点的属性列表。tag_list
:要过滤的节点的子标签列表。
函数的返回值是一个节点列表,其中每个节点都符合过滤条件。
下面的代码展示了如何使用这个封装函数来解析示例一中的XML文件,并输出其中价格大于10的书的信息:
import xml.etree.ElementTree as ET
# XML文件
xml_str = '''<?xml version="1.0" encoding="UTF-8"?>
<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>
<book id="bk102">
<author>Ralls, Kim</author>
<title>Midnight Rain</title>
<genre>Fantasy</genre>
<price>5.95</price>
<publish_date>2000-12-16</publish_date>
<description>A former architect battles corporate zombies,
an evil sorceress, and her own childhood to become queen
of the world.</description>
</book>
<book id="bk103">
<author>Corets, Eva</author>
<title>Maeve Ascendant</title>
<genre>Fantasy</genre>
<price>5.95</price>
<publish_date>2000-11-17</publish_date>
<description>After the collapse of a nanotechnology
society in England, the young survivors lay the
foundation for a new society.</description>
</book>
</catalog>'''
filtered_books = parse_xml(xml_str, 'book', ['price'], [])
for book in filtered_books:
price = float(book.get('price'))
if price > 10:
title = book.find('title').text
author = book.find('author').text
print('"{}" by {}'.format(title, author))
程序的运行结果如下:
"XML Developer's Guide" by Gambardella, Matthew
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python解析xml模块封装代码 - Python技术站