Python XML操作处理

来源:互联网 发布:手机淘宝自定义链接 编辑:程序博客网 时间:2024/06/10 15:53

Python XML操作处理

Python XML操作处理: 可扩展标记语言(XML)是一个很象HTML或SGML的标记语言。这是建议由万维网联盟作为一个开放的标准.

什么是XML ?

可扩展标记语言(XML)是一个很象HTML或SGML的标记语言。这是建议由万维网联盟作为一个开放的标准.

XML是一种便携式的,开源的语言,它允许程序员开发可以由其他应用程序读取的应用,无论操作系统和/或发展语言.

XML是非常有用的,为保持跟踪小到中量的数据,而不需要一个基于SQL的的支柱.

XML分析器体系结构和API:

Python标准库提供了一个最小的接口,但有用的一套使用XML.

两个最基本和最广泛使用的API,XML数据是SAX和DOM接口.

  • Simple API for XML (SAX) : 在这里你感兴趣的事件注册回调,然后让通过的文件进行的解析器。当您的文件是大型或你有内存限制,这是非常有用的,它解析的文件,因为它从磁盘读取整个文件没有存储在内存中.

  • Document Object Model (DOM) API : 这是万维网联盟的建议,其中将整个文件读入内存,并存储在一个层次(树状)的形式表示XML文档的所有功能.

SAX的,显然不能作为DOM快速处理的信息可以与大文件时的工作。另一方面,使用DOM完全可以真的操作你的资源,特别是如果使用大量小文件.

SAX是只读,而DOM允许修改XML文件。由于这两种不同的API的字面相辅相成,没有任何理由,你为什么不能使用大型项目.

为我们所有的XML代码例子,让我们用一个简单的XML文件movies.xml作为输入:

War, ThrillerDVD2003PG10Talk about a US-Japan warAnime, Science FictionDVD1989R8A schientific fictionAnime, ActionDVD4PG10Vash the Stampede!ComedyVHSPG2Viewable boredom

用SAX API的解析XML:

SAX是一种事件驱动的解析XML的标准接口。使用SAX解析XML的一般要求你通过继承xml.sax.ContentHandler创建自己的ContentHandler,.

您的ContentHandler的处理你的味道,特别是标签和属性的XML(S)。一个ContentHandler对象提供的方法来处理各种解析事件。其拥有的解析器调用ContentHandler方法,因为它解析XML文件.

startDocument和endDocument的方法被称为在开始和结束的XML文件。通过参数文本的方法字符(文本)通过XML文件中的字符数据.

ContentHandler是在每个元素的开始和结束。如果分析器不能在命名空间的模式,方法的startElement(标签,属性)和endElement(标签)被称为否则,相应方法startElementNS和endElementNS的被称为。在这里,标签元素的标签,和属性是一个属性对象.

在这里,还有其他重要的方法来了解,然后再进行:

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: 如果指定的ErrorHandler必须是一个SAX ErrorHandler对象.

parseString 方法:

还有一个方法创建一个SAX解析器来解析指定的XML字符串.

xml.sax.parseString(xmlstring, contenthandler[, errorhandler])

下面是详细的参数:

  • xmlstring: 这是读取XML字符串的名称.

  • contenthandler: 这必须是一个ContentHandler对象.

  • errorhandler: 如果指定的ErrorHandler必须是一个SAX ErrorHandler对象.

例子:

#!/usr/bin/pythonimport 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 = 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 BehindType: War, ThrillerFormat: DVDYear: 2003Rating: PGStars: 10Description: Talk about a US-Japan war*****Movie*****Title: TransformersType: Anime, Science FictionFormat: DVDYear: 1989Rating: RStars: 8Description: A schientific fiction*****Movie*****Title: TrigunType: Anime, ActionFormat: DVDRating: PGStars: 10Description: Vash the Stampede!*****Movie*****Title: IshtarType: ComedyFormat: VHSRating: PGStars: 2Description: Viewable boredom

对于一个SAX API文档的完整细节,请参考标准 Python SAX APIs.

XML的DOM API解析:

文档对象模型,或“DOM中,”是一个由万维网联盟(W3C)的跨语言的API,用于访问和修改XML文档.

DOM是随机存取的应用极为有用。 SAX只允许你的时间在一个文件的位的看法。如果你正在寻找一个SAX元素,你有没有到另一个接入.

这是最简单的方法快速加载一个XML文件,并创建一个minidom使用xml.dom中的模块对象。的minidom对象提供了一个简单的解析器的方法,很快就会从XML文件创建一个DOM树.

示例短语调用parse( file [,parser] )函数 minidom对象来解析XML文件的文件指定到一个DOM树对象.

#!/usr/bin/pythonfrom xml.dom.minidom import parseimport xml.dom.minidom# Open XML document using minidom parserDOMTree = xml.dom.minidom.parse("text.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

这将产生以下结果:

Root element : New Arrivals*****Movie*****Title: Enemy BehindType: War, ThrillerFormat: DVDRating: PGDescription: Talk about a US-Japan war*****Movie*****Title: TransformersType: Anime, Science FictionFormat: DVDRating: RDescription: A schientific fiction*****Movie*****Title: TrigunType: Anime, ActionFormat: DVDRating: PGDescription: Vash the Stampede!*****Movie*****Title: IshtarType: ComedyFormat: VHSRating: PGDescription: Viewable boredom

对DOM API文档的完整细节,请参考标准 Python DOM APIs.

0 0
原创粉丝点击