python XML处理 – Python高级开发教程

上一章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那样快速地处理信息。另一方面,仅使用DOM确实会消耗资源,特别是在许多小文件上。
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对象。
3、parseString方法
还有一个方法用于创建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

    推荐阅读