Python 3 - XML 处理
-
简述
XML 是一种可移植的开源语言,它允许程序员开发可以被其他应用程序读取的应用程序,而不管操作系统和/或开发语言如何。 -
什么是XML?
可扩展标记语言 (XML) 是一种非常类似于 HTML 或 SGML 的标记语言。这是万维网联盟推荐的,可作为开放标准使用。XML 对于跟踪中小量数据非常有用,无需基于 SQL 的主干。 -
XML 解析器架构和 API
Python 标准库提供了一组最小但有用的接口来处理 XML。XML 数据的两个最基本和广泛使用的 API 是 SAX 和 DOM 接口。-
Simple API for XML (SAX)− 在这里,您为感兴趣的事件注册回调,然后让解析器继续处理文档。当您的文档很大或您有内存限制时,这很有用,它会在从磁盘读取文件时解析文件,并且整个文件永远不会存储在内存中。
-
Document Object Model (DOM) API− 这是万维网联盟的建议,其中整个文件被读入内存并以分层(基于树的)形式存储以表示 XML 文档的所有功能。
在处理大文件时,SAX 显然无法像 DOM 那样快速地处理信息。另一方面,独占使用 DOM 确实会耗尽您的资源,尤其是在用于许多小文件时。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 方法。方法startDocument和endDocument在 XML 文件的开头和结尾被调用。方法characters(text)通过参数 text 传递 XML 文件的字符数据。ContentHandler 在每个元素的开始和结束时被调用。如果解析器不在命名空间模式下,方法startElement(tag, attributes)和endElement(tag)被调用;否则,调用相应的方法startElementNS和endElementNS。这里,tag 是元素标签,attributes 是一个 Attributes 对象。以下是在继续之前要了解的其他重要方法 - -
make_parser 方法
以下方法创建一个新的解析器对象并返回它。创建的解析器对象将是系统发现的第一个解析器类型。xml.sax.make_parser( [parser_list] )
以下是参数的详细信息 --
parser_list− 可选参数,由要使用的解析器列表组成,这些解析器必须全部实现 make_parser 方法。
-
-
解析方法
以下方法创建一个 SAX 解析器并使用它来解析文档。xml.sax.parse( xmlfile, contenthandler[, errorhandler])
以下是参数的详细信息 --
xmlfile− 这是要读取的 XML 文件的名称。
-
contenthandler− 这必须是一个 ContentHandler 对象。
-
errorhandler− 如果指定,errorhandler 必须是 SAX ErrorHandler 对象。
-
-
parseString 方法
还有一种方法可以创建 SAX 解析器并解析指定的XML string.xml.sax.parseString(xmlstring, contenthandler[, errorhandler])
以下是参数的详细信息 --
xmlstring− 这是要读取的 XML 字符串的名称。
-
contenthandler− 这必须是一个 ContentHandler 对象。
-
errorhandler− 如果指定,errorhandler 必须是 SAX ErrorHandler 对象。
例子
#!/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 = "" # Call when an element starts def startElement(self, tag, attributes): self.CurrentData = tag if tag == "movie": print ("*****Movie*****") title = attributes["title"] print ("Title:", title) # Call when an elements ends 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 = "" # Call when a character is read 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__"): # create an XMLReader parser = xml.sax.make_parser() # turn off namepsaces parser.setFeature(xml.sax.handler.feature_namespaces, 0) # override the default 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 Description: Talk about a US-Japan war *****Movie***** Title: Transformers Type: Anime, Science Fiction Format: DVD Year: 1989 Rating: R Stars: 8 Description: A scientific fiction *****Movie***** Title: Trigun Type: Anime, Action Format: DVD Rating: PG Stars: 10 Description: Vash the Stampede! *****Movie***** Title: Ishtar Type: Comedy Format: VHS Rating: PG Stars: 2 Description: Viewable boredom
有关 SAX API 文档的完整详细信息,请参阅标准Python SAX API。 -
-
使用 DOM API 解析 XML
文档对象模型(“DOM”)是来自万维网联盟(W3C)的跨语言 API,用于访问和修改 XML 文档。DOM 对于随机访问应用程序非常有用。SAX 一次只允许您查看文档的一部分。如果您查看的是一个 SAX 元素,则无法访问另一个元素。这是快速加载 XML 文档和使用 xml.dom 模块创建 minidom 对象的最简单方法。minidom 对象提供了一个简单的解析器方法,可以从 XML 文件快速创建 DOM 树。示例语句调用minidom对象的parse(file[,parser])函数将file指定的XML文件解析为DOM树对象。例子
#!/usr/bin/python3 from xml.dom.minidom import parse import xml.dom.minidom # Open XML document using minidom parser DOMTree = xml.dom.minidom.parse("movies.xml") collection = DOMTree.documentElement if collection.hasAttribute("shelf"): print ("Root element : %s" % collection.getAttribute("shelf")) # Get all the movies in the collection movies = collection.getElementsByTagName("movie") # Print detail of each 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)
输出
这将产生以下结果 -Root element : New Arrivals *****Movie***** Title: Enemy Behind Type: War, Thriller Format: DVD Rating: PG Description: Talk about a US-Japan war *****Movie***** Title: Transformers Type: Anime, Science Fiction Format: DVD Rating: R Description: A scientific fiction *****Movie***** Title: Trigun Type: Anime, Action Format: DVD Rating: PG Description: Vash the Stampede! *****Movie***** Title: Ishtar Type: Comedy Format: VHS Rating: PG Description: Viewable boredom
有关 DOM API 文档的完整详细信息,请参阅标准Python DOM APIs。