第41章 Python3 XML 解析教程

什么是 XML?

XML 指可扩展标记语言(eXtensible Markup Language),标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。 大神您可以通过本站学习 XML 教程

XML 被设计用来传输和存储数据。

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

它也是元标记语言,即定义了用于定义其他与特定领域有关的、语义的、结构化的标记语言的句法语言。


Python 对 XML 的解析

常见的 XML 编程接口有 DOM 和 SAX,这两种接口处理 XML 文件的方式不同,当然使用场合也不同。

Python 有三种方法解析 XML,SAX,DOM,以及 ElementTree:

1.SAX (simple API for XML )

Python 标准库包含 SAX 解析器,SAX 用事件驱动模型,通过在解析 XML 的过程中触发一个个的事件并调用用户定义的回调函数来处理 XML 文件。

2.DOM(Document Object Model)

将 XML 数据在内存中解析成一个树,通过对树的操作来操作 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>


Python 使用 SAX 解析 xml

SAX 是一种基于事件驱动的API。

利用 SAX 解析 XML 文档牵涉到两个部分: 解析器事件处理器

解析器负责读取 XML 文档,并向事件处理器发送事件,如元素开始跟元素结束事件。

而事件处理器则负责对事件作出响应,对传递的 XML 数据进行处理。

  • 1、对大型文件进行处理;
  • 2、只需要文件的部分内容,或者只需从文件中得到特定信息。
  • 3、想建立自己的对象模型的时候。

在 Python 中使用 sax 方式处理 xml 要先引入 xml.sax 中的 parse 函数,还有 xml.sax.handler 中的 ContentHandler。

ContentHandler 类方法介绍

characters(content) 方法

调用时机:

从行开始,遇到标签之前,存在字符,content 的值为这些字符串。

从一个标签,遇到下一个标签之前, 存在字符,content 的值为这些字符串。

从一个标签,遇到行结束符之前,存在字符,content 的值为这些字符串。

标签可以是开始标签,也可以是结束标签。

startDocument() 方法

文档启动的时候调用。

endDocument() 方法

解析器到达文档结尾时调用。

startElement(name, attrs) 方法

遇到XML开始标签时调用,name 是标签的名字,attrs 是标签的属性值字典。

endElement(name) 方法

遇到XML结束标签时调用。


make_parser 方法

以下方法创建一个新的解析器对象并return 。


    xml.sax.make_parser( [parser_list] )

参数说明:

  • parser_list - 非必输参数,解析器列表

parser 方法

以下方法创建一个 SAX 解析器并解析xml文档:


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

参数说明:

  • xmlfile - xml文件名
  • contenthandler - 必须是一个 ContentHandler 的对象
  • errorhandler - 如果指定该参数,errorhandler 必须是一个 SAX ErrorHandler 对象

parseString 方法

parseString 方法创建一个 XML 解析器并解析 xml 字符串:


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

参数说明:

  • xmlstring - xml字符串
  • contenthandler - 必须是一个 ContentHandler 的对象
  • errorhandler - 如果指定该参数,errorhandler 必须是一个 SAX ErrorHandler对象

Python 解析XML实例


    实例 
    #!/usr/bin/python3
    
    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 ("Description:", 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
    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 APIs


使用xml.dom解析xml

文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口。

一个 DOM 的解析器在解析一个 XML 文档时,一次性读取整个文档,把文档中所有元素保存在内存中的一个树结构里,之后大神您可以利用DOM 提供的不同的函数来读取或修改文档的内容和结构,也可以把修改过的内容写入xml文件。

Python 中用 xml.dom.minidom 来解析 xml 文件,实例如下:


    实例 
    #!/usr/bin/python3
    
    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 ("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 APIs

本专栏所有文章

第1章 Python3 教程第2章 Python3 简介教程
第3章 Python3 环境搭建教程第4章 Python3 VScode教程
第5章 Python3 基础语法教程第6章 Python3 基本数据类型教程
第7章 Python3 数据类型转换教程第8章 Python3 推导式教程
第9章 Python3 解释器教程第10章 Python3 注释教程
第11章 Python3 运算符教程第12章 Python3 数字(Number)教程
第13章 Python3 字符串教程第14章 Python3 列表教程
第15章 Python3 元组教程第16章 Python3 字典教程
第17章 Python3 集合教程第18章 Python3 编程第一步教程
第19章 Python3 条件控制教程第20章 Python3 循环语句教程
第21章 Python3 迭代器与生成器教程第22章 Python3 函数教程
第23章 Python3 数据结构教程第24章 Python3 模块教程
第25章 Python3 输入和输出教程第26章 Python3 File教程
第27章 Python3 OS教程第28章 Python3 错误和异常教程
第29章 Python3 面向对象教程第30章 Python3 命名空间/作用域教程
第31章 Python3 标准库概览教程第32章 Python3 实例教程
第33章 Python 测验教程第34章 Python3 正则表达式教程
第35章 Python3 CGI编程教程第36章 Python3 MySQL(mysql-connector)教程
第37章 Python3 MySQL(PyMySQL)教程第38章 Python3 网络编程教程
第39章 Python3 SMTP发送邮件教程第40章 Python3 多线程教程
第41章 Python3 XML 解析教程第42章 Python3 JSON教程
第43章 Python3 日期和时间教程第44章 Python3 内置函数教程
第45章 Python3 MongoDB教程第46章 Python3 urllib教程
第47章 Python uWSGI 安装配置教程第48章 Python3 pip教程
第49章 Python3 operator教程第50章 Python math教程
第51章 Python requests教程第52章 Python random教程
第53章 Python3 os.replace() 方法教程

寄语

本文有 phlcsdn2023 原创,欢迎点赞、转载,博客地址:https://blog.csdn.net/phlcsdn2023

  • 不责人小过,不发人隐私,不念人旧恶。三者可以养德,亦可以远害。
  • 我们必须培养属于生物因而也属于自然界的人适应社会生活;因为社会生活是人的特殊工作,所以它也必须符合人的自然活动的表现。
  • 告别的时候,尽可能轻一点,最好感觉像一个玩笑,让彼此感觉还有以后。
  • 不论你是一个男子还是一个女人,待人温和宽大才配得上人的名称。一个人的真正的英勇果断,决不等于用拳头制止别人发言。萨迪
  • 最糟糕的感觉就是明明最想要的东西,却要装成不在乎。
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你得不到的念想

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值