首页 > 编程语言 >无涯教程-Python - XML处理

无涯教程-Python - XML处理

时间:2023-08-26 13:32:07浏览次数:42  
标签:XML xml Python self 无涯 SAX print CurrentData

XML是一种可移植的开放源语言,它使程序员能够开发可由其他应用程序读取的应用程序,而无需考虑操作系统和/或开发语言。

可扩展标签语言(XML)是一种类似于HTML或SGML的标签语言。万维网联盟建议这样做,并且可以作为开放标准使用。

XML对跟踪少量到中等数量的数据而无需基于SQL的主干非常有用。

体系结构和API

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

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方法。

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

在每个元素的开始和结束处都会调用ContentHandler。如果解析器不在命名空间模式下,则调用方法 startElement(tag,attribute)和 endElement(tag);否则,将调用相应的方法 startElementNS 和 endElementNS 。在此,tag是元素标签,而attribute是Attributes对象。

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

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      -  如果指定,错误处理程序必须是SAX ErrorHandler对象。

ParseString 方法

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

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

这是参数的详细信息

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

  • contenthandler -  这必须是ContentHandler对象。

  • errorhandler      -  如果指定,错误处理程序必须是SAX 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=""

   # 元素开始时调用
   def startElement(self, tag, attributes):
      self.CurrentData=tag
      if tag == "movie":
         print "*****Movie*****"
         title=attributes["title"]
         print "Title:", title

   # 元素结束时调用
   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 "Remark:", self.description
      self.CurrentData=""

   # 读取字符时调用
   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__"):
   
   # 创建一个 XMLReader
   parser=xml.sax.make_parser()
   # 关闭命名空间
   parser.setFeature(xml.sax.handler.feature_namespaces, 0)

   # 覆盖默认的 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
描述: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Year: 1989
Rating: R
Stars: 8
Remark: A schientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Stars: 10
Remark: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Stars: 2
Remark: Viewable boredom

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

DOM API解析XML

文档对象模型(" DOM")是来自万维网联盟(W3C)的一种跨语言API,用于访问和修改XML文档。

DOM对于随机访问应用程序非常有用。 SAX一次只允许您查看一份文档。如果您正在查看一个SAX元素,则无权访问另一个元素。

这是使用xml.dom模块快速加载XML文档和创建minidom对象的最简单方法。 minidom对象提供了一种简单的解析器方法,该方法可以从XML文件快速创建DOM树。

示例短语调用minidom对象的parse(file [,parser])函数,以将file指定的XML文件解析为DOM树对象。

#!/usr/bin/python

from xml.dom.minidom import parse
import xml.dom.minidom

# 使用 minidom 解析器打开 XML 文档
DOMTree=xml.dom.minidom.parse("movies.xml")
collection=DOMTree.documentElement
if collection.hasAttribute("shelf"):
   print "Root element : %s" % collection.getAttribute("shelf")

# 获取集合中的所有电影
movies=collection.getElementsByTagName("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 "Remark: %s" % description.childNodes[0].data

这将产生以下输出-

Root element : New Arrivals
*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Rating: PG
Remark: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Rating: R
Remark: A schientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Remark: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Remark: Viewable boredom

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

参考链接

https://www.learnfk.com/python/python-xml-processing.html

标签:XML,xml,Python,self,无涯,SAX,print,CurrentData
From: https://blog.51cto.com/u_14033984/7243262

相关文章

  • 【python】使用ddddocr模块报错处理:AttributeError: module 'PIL.Image' has no attri
    安装pipinstallddddocr安装特别慢,几kb每秒,而且容易超时报错使用清华源下载:pipinstall-ihttps://pypi.tuna.tsinghua.edu.cn/simpleddddocr使用img_url="https://user.wangxiao.cn/apis//common/getImageCaptcha"img_resp=session.post(img_url)......
  • 无涯教程-Python - 多线程
    运行多个线程类似于同时运行多个不同的程序,但具有以下优点-一个进程中的多个线程与主线程共享相同的数据空间,因此比起单进程,它们可以更轻松地共享信息或彼此通信。有时称为轻量级进程的线程,它们不需要太多的内存开销。开始新线程要生成另一个线程,您需要调用thread模块中可......
  • Python中使用print()时如何实现不换行
    平时刷题的时候大家可能会发现打印字符的时候需要你不换行才能得到正确答案,那么如何实现的。下面直接看例子。使用print()函数时其实还有个默认的参数end,来看看具体怎么回事list=['a','b','c']foriinlist:print(i)打印结果:这是不加参数的情况,就是直接换行了,接下来看看加......
  • Python __init__.py—将文件夹设置成Python模块
    介绍包的标识符:__init__.py用于指示Python解释器将包含它的目录标识为一个模块包(modulepackage),所以它可以是一个空文件。但通常会包含一些关于包的元信息,比如包的版本号或作者信息。这些信息可以通过在__init__.py中定义变量来存储,并在包的其他模块中使用。导入模块和变量:......
  • 无涯教程-Python - 邮件发送
    简单邮件传输协议(SMTP)是一种协议,用于处理在邮件服务器之间发送电子邮件和路由电子邮件。Python提供了smtplib模块,该模块定义了SMTP客户端会话对象,该对象可用于MTP或ESMTP侦听器守护程序将邮件发送到任何网络机器。这是创建一个SMTP对象的简单语法,以后可以用于发送电子邮件-......
  • Python使用jieba分词输出txt文件
    1、准备好一个原始的txt文件2、在Pycharm里面下载jieba包3、将txt文件放到项目里面hlm.txt为原始文件;result.txt为存放结果的文件;4、分词代码importjiebaarticle=open('hlm.txt','r',encoding='UTF-8')sent=article.read()sent_list=jieba.cut(sent)resu......
  • Python多线程
    当进行多线程编程时,涉及到以下几个关键概念和操作多线程是指在一个进程中同时运行多个线程,每个线程都可以执行不同的任务。线程是操作系统能够进行运算调度的最小单位,它是进程中的一个实体,可以被操作系统独立调度。以下是与多线程相关的一些核心概念:1.**进程和线程**:-进程......
  • Python:过滤包含关键字的行
    PythonPandas:根据指定的关键字,过滤(提取)包含该关键字的行,并保存为Excel文件。importpandasaspdimportnumpyasnpinFile=r'D:\教学任务列表(理论课).xlsx'outFile=r'D:\教学任务(统计).xlsx'df1=pd.read_excel(inFile,header=1)type(df1)df1.head()df1.col......
  • python应用耗时分析
    Linuxtimecommandhttps://linuxize.com/post/linux-time-command/粗略分析整个程序的耗时情况。 timewgethttps://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.19.9.tar.xzWhatwillbeprintedasanoutputdependsontheversionofthetimecommandyou’reu......
  • 【8月摸鱼计划】Python GUI
    总结了一下Python下的图形界面GUI工具,暂时能找到的资料就这么多,后续会补充推荐学习资料。图形界面的定义图形界面图形用户界面(GraphicalUserInterface,简称GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。图形用户界面是一种人与计算机通信的界面显示格式,允许用......