一、概念
XML 是可扩展标记语言(eXtensible Markup Language),是标准通用标记语言的子集,也是一种用于标记电子文件使其具有结构性的标记语言
XML 被设计用来传输和存储数据(当使用数据库存储数据时,不建议使用XML储存数据)
XML 是一套定义语义标记的规则,这些标记将文档分成许多部件并对这些部件加以标识,它也是元标记语言,即定义了用于定义其他与特定领域有关的、语义的、结构化的标记语言的句法语言
XML文件格式介绍:
格式:<tag attrib = > text </tag> tail
例:
<APP_KEY channel = 'CSDN'> hello123456789 </APP_KEY>
说明:
1、tag,即标签:用于标识该元素表示哪种数据,即APP_KEY;
2、attrib,即属性:用字典(Dictionary)形式保存,即{‘channel’ = ‘CSDN’};
3、text,文本字符串:可以用来存储一些数据,即hello123456789;
4、tail,尾字符串:非必需,例子中没有包含;
该博客使用的 XML 文件:
<collection shelf="New Arrivals"> <movie title="战狼2"> <type director = '吴京'>战争片, 故事片</type> <format>DVD</format> <year>2018</year> <rating>PG</rating> <stars>10</stars> <description>吴京导演的一部爱国主义题材电影</description> </movie> <movie title="北京爱上西雅图"> <type>爱情片</type> <format>DVD</format> <year>2017</year> <rating>R</rating> <stars>8</stars> <description>美好的爱情故事</description> </movie> <movie title="唐人街探案2"> <type>喜剧,故事片</type> <format>DVD</format> <episodes>4</episodes> <rating>PG</rating> <stars>10</stars> <description>王宝强和刘昊然第二次合作探案</description> </movie> <movie title="大鱼海棠"> <type>动画</type> <format>VHS</format> <rating>PG</rating> <stars>2</stars> <description>国产动画片</description> </movie> </collection>
二、Python3 对 XML 的解析方式
Python 3对 XML 的解析方式一般有三种,即:SAX、DOM 和 ElementTree
2.1、SAX 方式(simple API for XML)
Python标准库包含 SAX 解析器,SAX 使用事件驱动模型,通过解析 XML 时触发一个个的事件并调用用户自定义的回调函数来解析 XML 文件
2.2、DOM 方式(Document Object Model)
将 XML 文件在内存中解析成一个树,通过对树的操作来解析 XML
三、Python3 使用 SAX 解析 XML
SAX 是一种基于事件驱动的 API,使用 SAX 解析 XML 涉及到两个部分:解析器和事件处理器。解析器负责读取 XML 文档,并向事件处理器发送事件,如元素开始跟元素结束事件;事件处理器则负责对事件作出响应,对传递的 XML 数据进行处理。
Python3 中使用 SAX 方式处理 XML 时需要先引入 xml.sax 中的 parse() 函数,还有 xml.sax.handler 中的 ContentHandler()函数
3.1、ContentHandler类方法
characters(content) 方法
调用位置:
1、从行开始,遇到标签之前,若存在字符,content 的值为这些字符串;
2、从一个标签,遇到下一个标签之前, 若存在字符,content 的值为这些字符串;
3、从一个标签,遇到行结束符之前,若存在字符,content 的值为这些字符串;
4、标签可以是开始标签,也可以是结束标签;
startDocument() 方法
文档启动的时候调用
endDocument() 方法
解析器到达文档结尾时调用
startElement(name, attrs) 方法
遇到XML开始标签时调用,name 是标签的名字,attrs 是标签的属性值字典
endElement(name) 方法
遇到XML结束标签时调用
3.2、make_parser()方法
make_parser()方法创建一个新的解析器对象并返回,语法为:
xml.sax.make_parser([parser_list])
parser_list:可选参数,解析器列表
3.3、parser()方法
parser()方法创建一个 SAX 解析器并解析xml文档,语法为:
xml.sax.parser(xmlfile , contenthandler, errorhandler)
xmlfile:xml文件名
contenthandler:必须是一个 ContentHandler 对象
errorhandler:如果指定该参数,errorhandler 必须是一个 SAX ErrorHandler 对象
3.4、parserString()方法
parserString()方法创建一个新的解析器并解析XML字符串,语法为:
xml.sax.parserString(xmlstring , contenthandler , errorhandler)
xmlstring:xml字符串
contenthandler:必须是一个 ContentHandler 对象
errorhandler:如果指定该参数,errorhandler 必须是一个 SAX ErrorHandler 对象
"""
使用SAX解析XML文件
"""
# 1、导入SAX包
from xml import sax
# 2、创建contenthandler类,继承xml.sax.ContentHandler
class Moviehandler(sax.ContentHandler