Python如何对XML 解析


Posted in Python onJune 28, 2020

什么是 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 方法

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

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。

以上就是Python如何对XML 解析的详细内容,更多关于Python对XML 解析的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python字符串加密解密的三种方法分享(base64 win32com)
Jan 19 Python
使用python实现strcmp函数功能示例
Mar 25 Python
python爬虫框架talonspider简单介绍
Jun 09 Python
Python将多个excel文件合并为一个文件
Jan 03 Python
python删除某个字符
Mar 19 Python
使用Python获取并处理IP的类型及格式方法
Nov 01 Python
python3中property使用方法详解
Apr 23 Python
Django中多种重定向方法使用详解
Jul 17 Python
python plotly绘制直方图实例详解
Jul 22 Python
python写入数据到csv或xlsx文件的3种方法
Aug 23 Python
解决django migrate报错ORA-02000: missing ALWAYS keyword
Jul 02 Python
使用Python开发贪吃蛇游戏 SnakeGame
Apr 30 Python
keras 自定义loss层+接受输入实例
Jun 28 #Python
python批量处理多DNS多域名的nslookup解析实现
Jun 28 #Python
解决Keras TensorFlow 混编中 trainable=False设置无效问题
Jun 28 #Python
Keras: model实现固定部分layer,训练部分layer操作
Jun 28 #Python
sklearn的predict_proba使用说明
Jun 28 #Python
基于python实现ROC曲线绘制广场解析
Jun 28 #Python
Python sklearn中的.fit与.predict的用法说明
Jun 28 #Python
You might like
PHP出错界面
2006/10/09 PHP
php实现自动获取生成文章主题关键词功能的深入分析
2013/06/03 PHP
PHP输出缓存ob系列函数详解
2014/03/11 PHP
PHP实现重载的常用方法实例详解
2017/10/18 PHP
javascript中使用new与不使用实例化对象的区别
2015/06/22 Javascript
基于JavaScript判断浏览器到底是关闭还是刷新(超准确)
2016/02/01 Javascript
Bootstrap按钮组件详解
2016/04/26 Javascript
AngularJS入门教程之模块化操作用法示例
2016/11/02 Javascript
JQuery获取鼠标进入和离开容器的方向
2016/12/29 Javascript
jQuery在header中设置请求信息的方法
2017/03/06 Javascript
JS实现多张图片预览同步上传功能
2017/06/23 Javascript
JavaScript编写的网页小游戏,很给力
2017/08/18 Javascript
vue2.0 移动端实现下拉刷新和上拉加载更多的示例
2018/04/23 Javascript
微信小程序实现长按删除图片的示例
2018/05/18 Javascript
VUE接入腾讯验证码功能(滑块验证)备忘
2019/05/07 Javascript
基于layui table返回的值的多级嵌套的解决方法
2019/09/19 Javascript
es6函数之尾递归用法实例分析
2020/04/25 Javascript
王纯业的Python学习笔记 下载
2007/02/10 Python
python实现的各种排序算法代码
2013/03/04 Python
在arcgis使用python脚本进行字段计算时是如何解决中文问题的
2015/10/18 Python
[原创]教女朋友学Python3(二)简单的输入输出及内置函数查看
2017/11/30 Python
python基础学习之如何对元组各个元素进行命名详解
2018/07/12 Python
keras 多任务多loss实例
2020/06/22 Python
python中的错误如何查看
2020/07/08 Python
Python下载网易云歌单歌曲的示例代码
2020/08/12 Python
jupyter notebook指定启动目录的方法
2021/03/02 Python
泰国王权免税店官方网站:KingPower
2019/03/11 全球购物
小学老师寄语大全
2014/04/04 职场文书
项目合作协议书范本
2014/04/16 职场文书
医院标语大全
2014/06/23 职场文书
2014年教师节寄语
2014/08/11 职场文书
学校食堂标语
2014/10/06 职场文书
婚宴父母致辞
2015/07/27 职场文书
《平行四边形的面积》教学反思
2016/02/16 职场文书
go语言中http超时引发的事故解决
2021/06/02 Golang
vue响应式原理与双向数据的深入解析
2021/06/04 Vue.js