Python3 XML 解析学习笔记
什么是XML?
XML(Extensible Markup Language)是一种用于存储和传输数据的标记语言。它可以用作配置文件、数据交换格式等。
XML解析方法
在Python中,我们可以使用以下三种方式解析XML:
- DOM解析:将整个XML文档载入内存中,形成树型结构,然后通过遍历树的方式来获取需要的信息。这种方式的缺点是占用大量内存,但是由于数据已经全部载入内存,因此访问速度比较快。
- SAX解析:采用事件驱动的方式,当解析器遇到开始标签、结束标签、文本等事件时,会回调用户提供的处理函数,从而完成XML文档的解析。这种方式不需要占用大量内存,但是访问速度比DOM解析慢。
- ET解析:ET是ElementTree的缩写,是Python标准库中常用的XML解析库。ET解析器既支持DOM方式访问XML文档的节点,也支持SAX方式解析文档。
DOM解析实例
pythonCopy Codeimport xml.dom.minidom
# 使用minidom解析器打开 XML 文档
dom = xml.dom.minidom.parse("books.xml")
# 得到文档元素对象
root = dom.documentElement
# 获取集合
books = root.getElementsByTagName('book')
# 遍历books
for book in books:
# 获取属性
print("*****Book*****")
if book.hasAttribute("id"):
print("ID: %s" % book.getAttribute("id"))
# 获取子元素
title = book.getElementsByTagName('title')[0]
author = book.getElementsByTagName('author')[0]
year = book.getElementsByTagName('year')[0]
price = book.getElementsByTagName('price')[0]
print("Title: %s" % title.childNodes[0].data)
print("Author: %s" % author.childNodes[0].data)
print("Year: %s" % year.childNodes[0].data)
print("Price: %s" % price.childNodes[0].data)
SAX解析实例
pythonCopy Codeimport xml.sax
class BookHandler(xml.sax.ContentHandler):
def __init__(self):
self.CurrentData = ""
self.title = ""
self.author = ""
self.year = ""
self.price = ""
# 元素开始事件处理
def startElement(self, tag, attributes):
self.CurrentData = tag
if tag == "book":
print("*****Book*****")
if "id" in attributes:
print("ID:", attributes["id"])
# 元素结束事件处理
def endElement(self, tag):
if self.CurrentData == "title":
print("Title:", self.title)
elif self.CurrentData == "author":
print("Author:", self.author)
elif self.CurrentData == "year":
print("Year:", self.year)
elif self.CurrentData == "price":
print("Price:", self.price)
self.CurrentData = ""
# 内容事件处理
def characters(self, content):
if self.CurrentData == "title":
self.title = content
elif self.CurrentData == "author":
self.author = content
elif self.CurrentData == "year":
self.year = content
elif self.CurrentData == "price":
self.price = content
# 创建一个 XMLReader
parser = xml.sax.make_parser()
# 关闭命名空间
parser.setFeature(xml.sax.handler.feature_namespaces, 0)
# 重写 ContextHandler
Handler = BookHandler()
parser.setContentHandler(Handler)
parser.parse("books.xml")
ET解析实例
pythonCopy Codeimport xml.etree.ElementTree as ET
# 解析 XML 文件
tree = ET.parse('books.xml')
# 获取根元素
root = tree.getroot()
# 遍历 books
for book in root.findall('book'):
# 获取属性值
if 'id' in book.attrib:
print('*****Book*****')
print('ID:', book.attrib['id'])
# 获取子元素值
title = book.find('title').text
author = book.find('author').text
year = book.find('year').text
price = book.find('price').text
print(f'Title: {title}')
print(f'Author: {author}')
print(f'Year: {year}')
print(f'Price: {price}')
以上三种方式都可以成功解析XML文档,根据实际需要选择合适的方式即可。