打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Python XML解析和处理

XML是一套定义语义标记的规则,这些标记将文档分成许多部件并对这些部件加以标识。

  1.什么是XML?

  可扩展标记语言(XML)是一种非常像HTML或SGML的标记语言。 这是由万维网联盟推荐的,可以作为开放标准。

  XML对于存储小到中等数量的数据非常有用,而不需要使用SQL。

  2.XML解析器体系结构和API

  Python标准库提供了一组极少使用但有用的接口来处理XML。两个最基本和最广泛使用在XML数据的API是SAX和DOM接口。

  简单XML API(SAX) : 在这里,注册感兴趣的事件回调,然后让解析器继续执行文档。 当文档较大或存在内存限制时,此功能非常有用,它会从文件读取文件时解析文件,并且整个文件不会存储在内存中。

  文档对象模型(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>2013</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>123456789101112131415161718192021222324252627282930313233复制代码类型:[python]

  3.使用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,attributes)和endElement(tag)方法; 否则,调用相应的方法startElementNS和endElementNS方法。 这里,tag是元素标签,属性是Attributes对象。

  以下是继续前面了解的其他重要方法 :

  make_parser()方法

  以下方法创建一个新的解析器对象并返回它。创建的解析器对象将是系统查找的第一个解析器类型。

xml.sax.make_parser( [parser_list] )12复制代码类型:[python]

  以下是参数的详细信息 :

  parser_list : 可选参数,由使用哪个解析器的列表组成,必须全部实现make_parser方法。

  parse()方法

  以下方法创建一个SAX解析器并使用它来解析文档。

xml.sax.parse( xmlfile, contenthandler[, errorhandler])1复制代码类型:[python]

  以下是参数的详细信息 :

  xmlfile : 这是要读取的XML文件的名称。

  contenthandler : 这必须是ContentHandler对象。

  errorhandler : 如果指定,errorhandler必须是SAX ErrorHandler

  parseString方法

  还有一种方法来创建SAX解析器并解析指定的XML字符串。

xml.sax.parseString(xmlstring, contenthandler[, errorhandler])1复制代码类型:[python]

  以下是参数的详细信息 :

  xmlstring : 这是要读取的XML字符串的名称。

  contenthandler : 这必须是ContentHandler对象。

  errorhandler : 如果指定,errorhandler必须是SAX ErrorHandler对象。

  示例

#!/usr/bin/python3import xml.saxclass 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 = contentif ( __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")1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465复制代码类型:[python]

  这将产生以下结果 :

*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Year: 2003Rating: PG
Stars: 10Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Year: 1989Rating: R
Stars: 8Description: A schientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Stars: 10Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Stars: 2Description: Viewable boredom12345678910111213141516171819202122232425262728293031复制代码类型:[python]

  有关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])函数来解析由文件指定为DOM树对象的XML文件。

  示例

#!/usr/bin/python3from xml.dom.minidom import parseimport xml.dom.minidom# Open XML document using minidom parserDOMTree = xml.dom.minidom.parse("movies.xml")
collection = DOMTree.documentElementif collection.hasAttribute("shelf"):   print ("Root element : %s" % collection.getAttribute("shelf"))# Get all the movies in the collectionmovies = 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)123456789101112131415161718192021222324252627282930复制代码类型:[python]

  这将产生以下结果 :

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 schientific 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 boredom1234567891011121314151617181920212223242526复制代码类型:[python]
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
Python3 XML解析 | 菜鸟教程
Python 进阶(八):XML 基本操作
第104天: Python 解析 XML
用Python解析XML的几种常见方法的介绍_python_脚本之家
XML Python 联合编程
解析xml之--SAX
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服