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用来获得图片exif信息的库实例分析
Mar 16 Python
举例讲解Python中is和id的用法
Apr 03 Python
python实现将文本转换成语音的方法
May 28 Python
python创建进程fork用法
Jun 04 Python
python类装饰器用法实例
Jun 04 Python
Python删除空文件和空文件夹的方法
Jul 14 Python
Python使用正则表达式获取网页中所需要的信息
Jan 29 Python
基于Django用户认证系统详解
Feb 21 Python
对python中的six.moves模块的下载函数urlretrieve详解
Dec 19 Python
python数据化运营的重要意义
Nov 25 Python
appium+python自动化配置(adk、jdk、node.js)
Nov 17 Python
全面介绍python中很常用的单元测试框架unitest
Dec 14 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各种编码集详解和以及在什么情况下进行使用
2011/09/11 PHP
php实现的CSS更新类实例
2014/09/22 PHP
PHP 年月日的三级联动实例代码
2017/05/24 PHP
仿163填写邮件地址自动显示下拉(无优化)
2008/11/05 Javascript
JQuery页面图片切换和新闻列表滚动效果的具体实现
2013/09/26 Javascript
jquery单选框radio绑定click事件实现方法
2015/01/14 Javascript
Knockout自定义绑定创建方法
2015/12/26 Javascript
BootstrapTable与KnockoutJS相结合实现增删改查功能【一】
2016/05/10 Javascript
vue项目实战总结篇
2018/02/11 Javascript
详解redis在nodejs中的应用
2018/05/02 NodeJs
小程序scroll-view组件实现滚动的示例代码
2018/09/20 Javascript
VUE引入第三方js包及调用方法讲解
2019/03/01 Javascript
Vue-CLI项目中路由传参的方式详解
2019/09/01 Javascript
Python时区设置方法与pytz查询时区教程
2013/11/27 Python
Python设计模式编程中Adapter适配器模式的使用实例
2016/03/02 Python
Django卸载之后重新安装的方法
2017/03/15 Python
python 多线程中子线程和主线程相互通信方法
2018/11/09 Python
django用户登录验证的完整示例代码
2019/07/21 Python
Python3 虚拟开发环境搭建过程(图文详解)
2020/01/06 Python
python识别验证码图片实例详解
2020/02/17 Python
解决pyqt5异常退出无提示信息的问题
2020/04/08 Python
Python如何输出警告信息
2020/07/30 Python
用Python制作mini翻译器的实现示例
2020/08/17 Python
如何快速一次性卸载所有python包(第三方库)呢
2020/10/20 Python
Python3中FuzzyWuzzy库实例用法
2020/11/18 Python
Html5页面中的返回实现的方法
2018/02/26 HTML / CSS
HQhair美国/加拿大:英国化妆品、美容及美发产品商城
2019/04/15 全球购物
领导干部群众路线对照检查材料
2014/11/05 职场文书
先进个人总结范文
2015/02/15 职场文书
公司聚餐通知
2015/04/22 职场文书
2015年公务员试用期工作总结
2015/05/28 职场文书
Pandas||过滤缺失数据||pd.dropna()函数的用法说明
2021/05/14 Python
Python3 多线程(连接池)操作MySQL插入数据
2021/06/09 Python
PostgreSQL解析URL的方法
2021/08/02 PostgreSQL
SQL SERVER存储过程用法详解
2022/02/24 SQL Server
Java 轮询锁使用时遇到问题
2022/05/11 Java/Android