Python3 XML 解析学习笔记

什么是XML?

XML(Extensible Markup Language)是一种用于存储和传输数据的标记语言。它可以用作配置文件、数据交换格式等。

XML解析方法

在Python中,我们可以使用以下三种方式解析XML:

  1. DOM解析:将整个XML文档载入内存中,形成树型结构,然后通过遍历树的方式来获取需要的信息。这种方式的缺点是占用大量内存,但是由于数据已经全部载入内存,因此访问速度比较快。
  2. SAX解析:采用事件驱动的方式,当解析器遇到开始标签、结束标签、文本等事件时,会回调用户提供的处理函数,从而完成XML文档的解析。这种方式不需要占用大量内存,但是访问速度比DOM解析慢。
  3. ET解析:ET是ElementTree的缩写,是Python标准库中常用的XML解析库。ET解析器既支持DOM方式访问XML文档的节点,也支持SAX方式解析文档。

DOM解析实例

pythonCopy Code
import 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 Code
import 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 Code
import 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文档,根据实际需要选择合适的方式即可。