Python3使用SAX解析XML详解与示例
本文介绍Python3中基于SAX(Simple API for XML)解析XML文档的方法。SAX采用事件驱动机制,包含解析器和事件处理器两部分,适用于大型文件或需提取特定信息的场景。文章通过具体代码示例演示如何继承[[wp:a3]]类并实现[[wp:a1]]函数,解析movies.xml文件并输出电影信息。
本文通过具体实例,详细讲解Python3环境下利用SAX库解析XML文件的操作流程,供读者参考学习。
Python中使用SAX解析XML的技术要点
SAX(Simple API for XML)是一种基于事件驱动的API接口。
使用SAX解析XML文档主要涉及两个核心组件:解析器和事件处理器。
解析器的职责是读取XML文档内容,并向事件处理器发送相应的事件通知,例如元素开始和元素结束等信号。
事件处理器则负责接收这些事件,并对传递过来的XML数据进行相应的处理逻辑。
SAX解析方式主要适用于以下场景: 1、处理体积庞大的XML文件; 2、仅需获取文件中部分数据,或只需提取特定字段信息; 3、需要构建自定义的对象模型时。
在Python中采用SAX方式处理XML,首先需要引入xml.sax模块中的parse函数,同时还需要使用xml.sax.handler模块中的ContentHandler类。
示例代码文件:saxDemo.py
# -*- coding:utf-8 -*-
#!/usr/bin/python3
import xml.sax
class MovieHandler( xml.sax.ContentHandler ):
def __init__(self):
self.CurrentData = ""
self.type = ""
self.format = ""
self.year = ""
self.rating = ""
self.stars = ""
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 == "year":
print ("Year:", self.year)
elif self.CurrentData == "rating":
print ("Rating:", self.rating)
elif self.CurrentData == "stars":
print ("Stars:", self.stars)
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 == "year":
self.year = content
elif self.CurrentData == "rating":
self.rating = content
elif self.CurrentData == "stars":
self.stars = content
elif self.CurrentData == "description":
self.description = content
if ( __name__ == "__main__"):
# 创建一个 XMLReader
parser = xml.sax.make_parser()
# turn off namepsaces
parser.setFeature(xml.sax.handler.feature_namespaces, 0)
# 重写 ContextHandler
Handler = MovieHandler()
parser.setContentHandler( Handler )
parser.parse("movies.xml")
程序运行输出结果如下
*****Movie***** Title: Enemy Behind Type: love中国 Format: DVD Year: 2003 Rating: PG Stars: 10 Description: Talk about a US-Japan war *****Movie***** Title: Transformers Type: Anime, Science Fiction Format: DVD Year: 1989 Rating: R Stars: 8 Description: A schientific fiction
具体运行结果如下图所示

待解析的movies.xml文件内容如下
<?xml version="1.0" encoding="utf-8"?> <collection shelf="New Arrivals"> <movie title="Enemy Behind"> <type>love中国</type> <format>DVD</format> <year>2003</year> <rating>PG</rating> <stars>10</stars> <description>Talk about a US-Japan war</description> </movie> <movie title="Transformers"> <type>Anime, Science Fiction</type> <format>DVD</format> <year>1989</year> <rating>R</rating> <stars>8</stars> <description>A schientific fiction</description> </movie> </collection>
此外,推荐以下在线XML操作工具供参考使用
在线XML与JSON格式互转工具: http://tools.jb51.net/code/xmljson
在线XML格式化与压缩工具: http://tools.jb51.net/code/xmlformat
XML在线压缩及格式化工具: http://tools.jb51.net/code/xml_format_compress
XML代码在线格式化与美化工具: http://tools.jb51.net/code/xmlcodeformat
若读者对Python处理XML数据感兴趣,可进一步查阅本站相关专题:《Python操作xml数据技巧总结》、《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》以及《Python文件与目录操作技巧汇总》。
希望上述内容能对各位Python程序开发者有所帮助。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













