上一章Python教程请查看:python多线程编程
XML是一种可移植的开放源码语言,它允许程序员开发可以被其他应用程序读取的应用程序,而不必考虑操作系统和/或开发语言。
一、XML是什么?可扩展标记语言(XML)是一种类似于HTML或SGML的标记语言,这是由万维网联盟推荐的开放标准。
在不需要基于sql的主干的情况下,XML对于跟踪中小型数据非常有用。
二、XML解析器体系结构和apiPython标准库提供了一组用于处理XML的最小但有用的接口。
用于XML数据的两个最基本和最广泛使用的api是SAX和DOM接口。
- XML的简单API (SAX)——在这里为感兴趣的事件注册回调,然后让解析器遍历文档。当你的文档很大或有内存限制时,这是很有用的,它在从磁盘读取文件时解析文件,而整个文件从不存储在内存中。
- 文档对象模型(Document Object Model, DOM) API——这是一个万维网联盟的建议,其中将整个文件读入内存并以分层(基于树)的形式存储,以表示XML文档的所有特性。
SAX是只读的,而DOM允许更改XML文件。由于这两个不同的api实际上是互补的,所以没有理由不能在大型项目中同时使用它们。
对于我们所有的XML代码示例,让我们使用一个简单的XML文件movies.xml作为输入:
<
collection shelf="New Movies">
<
movie title="Black Forest">
<
type>Thriller<
/type>
<
format>DVD<
/format>
<
year>2018<
/year>
<
rating>PG<
/rating>
<
stars>3<
/stars>
<
description>Talk about black<
/description>
<
/movie>
<
movie title="Once Up On A Time">
<
type>Science Fiction<
/type>
<
format>DVD<
/format>
<
year>1989<
/year>
<
rating>R<
/rating>
<
stars>8<
/stars>
<
description>once up on a time, there<
/description>
<
/movie>
<
movie title="Music">
<
type>Action<
/type>
<
format>DVD<
/format>
<
episodes>4<
/episodes>
<
rating>PG<
/rating>
<
stars>8<
/stars>
<
description>balabala…<
/description>
<
/movie>
<
movie title="Funny Pig">
<
type>Comedy<
/type>
<
format>VHS<
/format>
<
rating>PG<
/rating>
<
stars>2<
/stars>
<
description>a sotry about a donkey and a pig<
/description>
<
/movie>
<
/collection>
三、使用SAX api解析XMLSAX是事件驱动XML解析的标准接口,使用SAX解析XML通常需要通过子类化xml.sax.ContentHandler来创建自己的ContentHandler。
ContentHandler处理XML的特定标记和属性,ContentHandler对象提供了处理各种解析事件的方法,它的解析器在解析XML文件时调用ContentHandler方法。
方法startDocument和endDocument在XML文件的开头和结尾调用,方法characters(文本)通过参数文本传递XML文件的字符数据。
ContentHandler在每个元素的开头和结尾调用,如果解析器不在名称空间模式,则调用startElement(标记、属性)和endElement(标记)方法,否则将调用相应的方法startElementNS和endElementNS,这里tag是元素标记,attributes是attributes对象。
这里有一些重要的方法,你必须先了解,然后才能继续
1、make_parser方法
下面的方法创建一个新的解析器对象并返回它,所创建的解析器对象是系统找到的第一个解析器类型。
xml.sax.make_parser( [parser_list] )
这里是参数的细节:
parser_list——一个可选的参数,它包含一个要使用的解析器列表,所有这些解析器都必须实现make_parser方法。
2、parse方法
下面的方法创建一个SAX解析器并使用它解析文档。
xml.sax.parse( xmlfile, contenthandler[, errorhandler])
这里是参数的细节:
- xmlfile——这是要从中读取的XML文件的名称。
- contenthandler——这一定是一个ContentHandler对象。
- 如果指定了errorhandler,则errorhandler必须是SAX errorhandler对象。
还有一个方法用于创建SAX解析器和解析指定的XML字符串。
xml.sax.parseString(xmlstring, contenthandler[, errorhandler])
【python XML处理 – Python高级开发教程】这里是参数的细节:
- xmlstring——这是要读取的XML字符串的名称。
- contenthandler——这一定是一个ContentHandler对象。
- 如果指定了errorhandler,则errorhandler必须是SAX errorhandler对象。
#!/usr/bin/pythonimport xml.saxclass MovieHandler( xml.sax.ContentHandler ):
def __init__(self):
self.CurrentDatahttp://www.srcmini.com/= ""
self.type = ""
self.format = ""
self.year = ""
self.rating = ""
self.stars = ""
self.description = ""# 当元素开始时调用
def startElement(self, tag, attributes):
self.CurrentData = http://www.srcmini.com/tag
if tag =="movie":
print "*****Movie*****"
title = attributes["title"]
print "Title:", title# 当元素结束时调用
def endElement(self, tag):
if self.CurrentData =http://www.srcmini.com/="type":
print "Type:", self.type
elif self.CurrentData =http://www.srcmini.com/="format":
print "Format:", self.format
elif self.CurrentData =http://www.srcmini.com/="year":
print "Year:", self.year
elif self.CurrentData =http://www.srcmini.com/="rating":
print "Rating:", self.rating
elif self.CurrentData =http://www.srcmini.com/="stars":
print "Stars:", self.stars
elif self.CurrentData =http://www.srcmini.com/="description":
print "Description:", self.description
self.CurrentDatahttp://www.srcmini.com/= ""# 读取字符时调用
def characters(self, content):
if self.CurrentData =http://www.srcmini.com/="type":
self.type = content
elif self.CurrentData =http://www.srcmini.com/="format":
self.format = content
elif self.CurrentData =http://www.srcmini.com/="year":
self.year = content
elif self.CurrentData =http://www.srcmini.com/="rating":
self.rating = content
elif self.CurrentData =http://www.srcmini.com/="stars":
self.stars = content
elif self.CurrentData =http://www.srcmini.com/="description":
self.description = contentif ( __name__ == "__main__"):# 创建一个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 API文档的完整细节,请参阅标准Python SAX API。
四、使用DOM api解析XML文档对象模型(“DOM”)是来自万维网联盟(W3C)的跨语言API,用于访问和修改XML文档。
DOM对于随机访问应用程序非常有用,SAX一次只允许查看文档的一部分,如果查看一个SAX元素,则无法访问另一个元素。
下面是快速加载XML文档和使用XML创建minidom对象的最简单方法,xml.dom模块minidom对象提供了一个简单的解析器方法,可以从XML文件快速创建DOM树。
示例调用minidom对象的parse(file [,parser])函数,将文件指定的XML文件解析为DOM树对象。
#!/usr/bin/pythonfrom xml.dom.minidom import parse
import xml.dom.minidom# 使用minidom解析器打开XML文档
DOMTree = xml.dom.minidom.parse("movies.xml")
collection = DOMTree.documentElement
if collection.hasAttribute("shelf"):
print "Root element : %s" % collection.getAttribute("shelf")# 获取所有movie
movies = collection.getElementsByTagName("movie")# 打印每个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
有关DOM API文档的完整细节,请参阅标准Python DOM API
推荐阅读
- python GUI编程 – Python高级开发教程
- python多线程编程 – Python高级开发教程
- python使用SMTP发送邮件 – Python高级开发教程
- python socket网络编程原理和操作 – Python高级开发教程
- Python OpenCV cv2.line()方法用法介绍
- python访问MySQL数据库及其操作详解 – Python高级开发教程
- python CGI编程和Web开发 – Python高级开发教程
- python正则表达式介绍和用法 – Python高级开发教程
- python面向对象编程(类和对象详解介绍 – Python高级开发教程)