亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> Python

Python - XML 处理

上一页下一页

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

什么是 XML?

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

XML 对于跟踪中小型数据量非常有用,无需基于 SQL 的主干。

XML 解析器架构和 API

Python 标准库提供了一组最小但有用的接口来处理 XML。

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

在处理大文件时,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 方法。

方法 startDocumentendDocument 在 XML 文件的开头和结尾调用。方法 characters(text) 是通过参数text传递的XML文件的字符数据。

ContentHandler 在每个元素的开始和结束处被调用。如果解析器未处于命名空间模式,则方法 startElement(tag, attributes)endElement(tag) 被称为;否则,对应的方法 startElementNSendElementNS 被称为。这里的tag是元素标签,attributes是一个Attributes对象。

以下是在继续之前需要了解的其他重要方法 -

make_parser 方法

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

xml.sax.make_parser( [parser_list] )

这是参数的详细信息 -

解析 方法

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

xml.sax.parse( xmlfile, contenthandler[, errorhandler])

这是参数的详细信息 -

解析字符串 方法

还有另一种方法可以创建 SAX 解析器并解析指定的 XML 字符串 .

xml.sax.parseString(xmlstring, contenthandler[, 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 = ""

   # 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 schientific 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/python

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 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 boredom

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


Python

  1. Python 数据类型
  2. Python 运算符
  3. Python pass 语句
  4. Python 函数参数
  5. Python字典
  6. Python 迭代器
  7. Python 闭包
  8. Python 日期时间
  9. Python 睡眠()
  10. Python - 概述
  11. Python - 数字
  12. Python - 字符串