XML是一种可移植的开放源语言,它使程序员能够开发可由其他应用程序读取的应用程序,而无需考虑操作系统和/或开发语言。
可扩展标签语言(XML)是一种类似于HTML或SGML的标签语言。万维网联盟建议这样做,并且可以作为开放标准使用。
XML对跟踪少量到中等数量的数据而无需基于SQL的主干非常有用。
体系结构和API
Python标准库提供了一组最小但有用的接口来使用XML。
SAX是只读的,而DOM允许更改XML文件。由于这两个不同的API在字面上相互补充,因此没有理由不能在大型项目中同时使用它们。
对于无涯教程所有的XML代码示例,使用一个简单的XML文件 movies.xml 作为输入-
<collection shelf="New Arrivals"> <movie title="Enemy Behind"> <type>War, Thriller</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> <movie title="Trigun"> <type>Anime, Action</type> <format>DVD</format> <episodes>4</episodes> <rating>PG</rating> <stars>10</stars> <description>Vash the Stampede!</description> </movie> <movie title="Ishtar"> <type>Comedy</type> <format>VHS</format> <rating>PG</rating> <stars>2</stars> <description>Viewable boredom</description> </movie> </collection>
SAX API解析XML
SAX是事件驱动的XML解析的标准接口。使用SAX解析XML通常要求您通过子类化xml.sax.ContentHandler来创建自己的ContentHandler。
您的 ContentHandler 处理XML风格的特定标签和属性。 ContentHandler对象提供了处理各种解析事件的方法。它拥有的解析器在解析XML文件时调用ContentHandler方法。
在XML文件的开头和结尾处调用方法 startDocument 和 endDocument 。方法 characters(text)通过参数text传递给XML文件的字符数据。
在每个元素的开始和结束处都会调用ContentHandler。如果解析器不在命名空间模式下,则调用方法 startElement(tag,attribute)和 endElement(tag);否则,将调用相应的方法 startElementNS 和 endElementNS 。在此,tag是元素标签,而attribute是Attributes对象。
这是在继续之前要了解的其他重要方法-
Make_parser 方法
以下方法创建一个新的解析器对象并返回它。创建的解析器对象将是系统找到的第一个解析器类型。
xml.sax.make_parser( [parser_list] )
这是参数的详细信息-
parser_list - 可选参数,由要使用的解析器列表组成,必须全部实现make_parser方法。
Parse 方法
以下方法创建一个SAX解析器,并使用它来解析文档。
xml.sax.parse( xmlfile, contenthandler[, errorhandler])
这是参数的详细信息-
xmlfile - 这是要读取的XML文件的名称。
contenthandler - 这必须是ContentHandler对象。
errorhandler - 如果指定,错误处理程序必须是SAX ErrorHandler对象。
ParseString 方法
还有另一种方法来创建SAX解析器并解析指定的 XML字符串。
xml.sax.parseString(xmlstring, contenthandler[, errorhandler])
这是参数的详细信息
xmlstring - 这是要读取的XML字符串的名称。
contenthandler - 这必须是ContentHandler对象。
errorhandler - 如果指定,错误处理程序必须是SAX ErrorHandler对象。
#!/usr/bin/python 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 "Remark:", 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() # 关闭命名空间 parser.setFeature(xml.sax.handler.feature_namespaces, 0) # 覆盖默认的 ContextHandler Handler=MovieHandler() parser.setContentHandler( Handler ) parser.parse("movies.xml")
这将产生以下输出-
*****Movie***** Title: Enemy Behind Type: War, Thriller Format: DVD Year: 2003 Rating: PG Stars: 10 描述: Talk about a US-Japan war *****Movie***** Title: Transformers Type: Anime, Science Fiction Format: DVD Year: 1989 Rating: R Stars: 8 Remark: A schientific fiction *****Movie***** Title: Trigun Type: Anime, Action Format: DVD Rating: PG Stars: 10 Remark: Vash the Stampede! *****Movie***** Title: Ishtar Type: Comedy Format: VHS Rating: PG Stars: 2 Remark: Viewable boredom
有关SAX API文档的完整详细信息,请参考标准Python SAX API。
DOM API解析XML
文档对象模型(" DOM")是来自万维网联盟(W3C)的一种跨语言API,用于访问和修改XML文档。
DOM对于随机访问应用程序非常有用。 SAX一次只允许您查看一份文档。如果您正在查看一个SAX元素,则无权访问另一个元素。
这是使用xml.dom模块快速加载XML文档和创建minidom对象的最简单方法。 minidom对象提供了一种简单的解析器方法,该方法可以从XML文件快速创建DOM树。
示例短语调用minidom对象的parse(file [,parser])函数,以将file指定的XML文件解析为DOM树对象。
#!/usr/bin/python from 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") # 获取集合中的所有电影 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 "Remark: %s" % description.childNodes[0].data
这将产生以下输出-
Root element : New Arrivals *****Movie***** Title: Enemy Behind Type: War, Thriller Format: DVD Rating: PG Remark: Talk about a US-Japan war *****Movie***** Title: Transformers Type: Anime, Science Fiction Format: DVD Rating: R Remark: A schientific fiction *****Movie***** Title: Trigun Type: Anime, Action Format: DVD Rating: PG Remark: Vash the Stampede! *****Movie***** Title: Ishtar Type: Comedy Format: VHS Rating: PG Remark: Viewable boredom
有关DOM API文档的完整详细信息,请参考标准Python DOM API。
参考链接
https://www.learnfk.com/python/python-xml-processing.html
标签:XML,xml,Python,self,无涯,SAX,print,CurrentData From: https://blog.51cto.com/u_14033984/7243262