龙空技术网

Python 3 高级编程 - XML 编程

逸剑听潮 126

前言:

眼前看官们对“js 解析xml字符串”大约比较注意,各位老铁们都需要了解一些“js 解析xml字符串”的相关内容。那么小编也在网上汇集了一些对于“js 解析xml字符串””的相关内容,希望同学们能喜欢,咱们快快来学习一下吧!

XML 是一种可移植的开源语言,它允许程序员开发可以被其他应用程序读取的应用程序,而不管操作系统和/或开发语言如何。

可扩展标记语言 (XML) 是一种非常类似于 HTML 或 SGML 的标记语言。这是万维网联盟推荐的,可作为开放标准使用。XML 对于跟踪中小量数据非常有用,无需基于 SQL 的主干。

XML 解析器架构和 API

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

Simple API for XML (SAX) - 在这里,为感兴趣的事件注册回调,然后让解析器继续处理文档。当您的文档很大或您有内存限制时,这很有用,它会在从磁盘读取文件时解析文件,并且整个文件永远不会存储在内存中。Document Object Model (DOM) API - 这是万维网联盟的推荐,其中整个文件被读入内存并以分层(基于树的)形式存储以表示 XML 文档的所有功能

在处理大文件时,SAX 显然无法像 DOM 那样快速地处理信息。另一方面,独占使用 DOM 确实会耗尽资源,尤其是在用于许多小文件时。SAX 是只读的,而 DOM 允许更改 XML 文件。由于这两个不同的 API 实际上是相互补充的,因此没有理由不能将它们同时用于大型项目。

例如,使用一个简单的 XML 文件 movies.xml 作为输入:

<collection shelf = "New Arrivals"><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 方法。

parser 方法

以下方法创建一个 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 对象。

例如:

import 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: TrigunType: Anime, ActionFormat: DVDRating: PGStars: 10Description: Vash the Stampede!*****Movie*****Title: IshtarType: ComedyFormat: VHSRating: PGStars: 2Description: 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树对象。

例如:

from 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)

运行结果:

Root element : New Arrivals*****Movie*****Title: TrigunType: Anime, ActionFormat: DVDRating: PGDescription: Vash the Stampede!*****Movie*****Title: IshtarType: ComedyFormat: VHSRating: PGDescription: Viewable boredom

注:有关 DOM API 文档的完整详细信息,可参阅标准 Python DOM APIs。

标签: #js 解析xml字符串