当我们需要处理XML文件时,我们需要从XML文档中读取数据并进行处理,这就需要使用XML解析来解析XML。下面是XML解析的四种方式,以及代码示例和详细讲解。
DOM(文档对象模型)解析方式
DOM是将整个XML文档一次性加载到内存中再进行解析的方式。它允许访问整个文档的节点,但可能需要大量的内存。
DOM解析方式的代码示例:
from xml.dom.minidom import parse
import xml.dom.minidom
# 打开 XML 文档
DOMTree = xml.dom.minidom.parse("movies.xml")
collection = DOMTree.documentElement
if collection.hasAttribute("shelf"):
print("Root element : %s" % collection.getAttribute("shelf"))
# 在集合中获取所有电影
movies = collection.getElementsByTagName("movie")
# 打印每部电影的详细信息
for movie in movies:
print("*****Movie*****")
if movie.hasAttribute("title"):
print("Title: %s" % movie.getAttribute("title"))
type = movie.getElementsByTagName('type')[0]
print("Type: %s" % type.childNodes[0].data)
format = movie.getElementsByTagName('format')[0]
print("Format: %s" % format.childNodes[0].data)
rating = movie.getElementsByTagName('rating')[0]
print("Rating: %s" % rating.childNodes[0].data)
description = movie.getElementsByTagName('description')[0]
print("Description: %s" % description.childNodes[0].data)
在上面的代码中,我们使用xml.dom.minidom模块来解析XML。首先打开XML文档,然后在文档中获取所有的“movie”元素,并打印每部电影的详细信息。
SAX(简单API for XML)解析方式
SAX解析方式是一种基于事件驱动的解析方式,它不需要将整个XML文档加载到内存中,而是开始解析文档后逐个读取元素并处理。SAX解析方式比DOM方式更快,更有效,但不支持文档树的随机访问。
SAX解析方式的代码示例:
import xml.sax
class MovieHandler(xml.sax.ContentHandler):
def __init__(self):
self.CurrentData = ""
self.type = ""
self.format = ""
self.rating = ""
self.description = ""
# 元素开始事件处理
def startElement(self, tag, attributes):
self.CurrentData = tag
if tag == "movie":
print("*****Movie*****")
title = attributes["title"]
print("Title:", title)
# 元素结束事件处理
def endElement(self, tag):
if self.CurrentData == "type":
print("Type:", self.type)
elif self.CurrentData == "format":
print("Format:", self.format)
elif self.CurrentData == "rating":
print("Rating:", self.rating)
elif self.CurrentData == "description":
print("Description:", self.description)
self.CurrentData = ""
# 内容事件处理
def characters(self, content):
if self.CurrentData == "type":
self.type = content
elif self.CurrentData == "format":
self.format = content
elif self.CurrentData == "rating":
self.rating = content
elif self.CurrentData == "description":
self.description = content
# 创建一个 XMLReader
parser = xml.sax.make_parser()
# 关闭命名空间
parser.setFeature(xml.sax.handler.feature_namespaces, 0)
# 重写 ContextHandler
Handler = MovieHandler()
parser.setContentHandler( Handler )
parser.parse("movies.xml")
在上面的代码中,我们首先创建了一个SAX解析器。然后创建了一个处理器类,其中包括了处理元素开始事件、元素结束事件和内容事件的方法。在解析XML文档时,SAX解析器会回调处理器类的方法,以便进行处理。
ElementTree解析方式
ElementTree解析方式是Python的一个标准库,它以一种简单而优美的方式处理XML文件,可以列举找出所有节点、遍历、查找、添加、修改和删除节点,以及支持XPath表达式和命名空间。ElementTree解析方式比DOM方式更快,而且占用的内存更少。
ElementTree解析方式的代码示例:
import xml.etree.ElementTree as ET
tree = ET.parse('movies.xml')
root = tree.getroot()
# 打印每部电影的详细信息
for movie in root.findall('movie'):
print("*****Movie*****")
title = movie.get('title')
print("Title:", title)
type = movie.find('type').text
print("Type:", type)
format = movie.find('format').text
print("Format:", format)
rating = movie.find('rating').text
print("Rating:", rating)
description = movie.find('description').text
print("Description:", description)
在上面的代码中,我们首先使用ElementTree模块解析XML文档,然后从文档中提取所有的“movie”元素并打印每部电影的详细信息。
lxml解析方式
lxml解析方式是一种高性能、易用、Pythonic的解析方式,它可以与XPath表达式和CSS选择器一起使用。lxml解析方式支持树形导航结构和事件驱动两种模式,内存占用小,速度快。
lxml解析方式的代码示例:
from lxml import etree
tree = etree.parse('movies.xml')
root = tree.getroot()
# 打印每部电影的详细信息
for movie in root.xpath('/collection/movie'):
print("*****Movie*****")
title = movie.get('title')
print("Title:", title)
type = movie.find('type').text
print("Type:", type)
format = movie.find('format').text
print("Format:", format)
rating = movie.find('rating').text
print("Rating:", rating)
description = movie.find('description').text
print("Description:", description)
在上面的代码中,我们首先使用lxml模块解析XML文档,然后利用XPath表达式从文档中提取所有的“movie”元素并打印每部电影的详细信息。
以上就是XML解析四种方式的详细代码示例和讲解。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:XML解析四种方式代码示例详解 - Python技术站