在Python中处理XML的教程


Posted in Python onApril 29, 2015

XML虽然比JSON复杂,在Web中应用也不如以前多了,不过仍有很多地方在用,所以,有必要了解如何操作XML。
DOM vs SAX

操作XML有两种方法:DOM和SAX。DOM会把整个XML读入内存,解析为树,因此占用内存大,解析慢,优点是可以任意遍历树的节点。SAX是流模式,边读边解析,占用内存小,解析快,缺点是我们需要自己处理事件。

正常情况下,优先考虑SAX,因为DOM实在太占内存。

在Python中使用SAX解析XML非常简洁,通常我们关心的事件是start_element,end_element和char_data,准备好这3个函数,然后就可以解析xml了。

举个例子,当SAX解析器读到一个节点时:

<a href="/">python</a>

会产生3个事件:

  1.     start_element事件,在读取<a href="/">时;
  2.     char_data事件,在读取python时;
  3.     end_element事件,在读取</a>时。

用代码实验一下:

from xml.parsers.expat import ParserCreate

class DefaultSaxHandler(object):
  def start_element(self, name, attrs):
    print('sax:start_element: %s, attrs: %s' % (name, str(attrs)))

  def end_element(self, name):
    print('sax:end_element: %s' % name)

  def char_data(self, text):
    print('sax:char_data: %s' % text)

xml = r'''<?xml version="1.0"?>
<ol>
  <li><a href="/python">Python</a></li>
  <li><a href="/ruby">Ruby</a></li>
</ol>
'''
handler = DefaultSaxHandler()
parser = ParserCreate()
parser.returns_unicode = True
parser.StartElementHandler = handler.start_element
parser.EndElementHandler = handler.end_element
parser.CharacterDataHandler = handler.char_data
parser.Parse(xml)

当设置returns_unicode为True时,返回的所有element名称和char_data都是unicode,处理国际化更方便。

需要注意的是读取一大段字符串时,CharacterDataHandler可能被多次调用,所以需要自己保存起来,在EndElementHandler里面再合并。

除了解析XML外,如何生成XML呢?99%的情况下需要生成的XML结构都是非常简单的,因此,最简单也是最有效的生成XML的方法是拼接字符串:

L = []
L.append(r'<?xml version="1.0"?>')
L.append(r'<root>')
L.append(encode('some & data'))
L.append(r'</root>')
return ''.join(L)

如果要生成复杂的XML呢?建议你不要用XML,改成JSON。
小结

解析XML时,注意找出自己感兴趣的节点,响应事件时,把节点数据保存起来。解析完毕后,就可以处理数据。

练习一下解析Yahoo的XML格式的天气预报,获取当天和最近几天的天气:

http://weather.yahooapis.com/forecastrss?u=c&w=2151330

参数w是城市代码,要查询某个城市代码,可以在weather.yahoo.com搜索城市,浏览器地址栏的URL就包含城市代码。

Python 相关文章推荐
跟老齐学Python之编写类之二方法
Oct 11 Python
Python类定义和类继承详解
May 08 Python
Python中subprocess的简单使用示例
Jul 28 Python
Python中绑定与未绑定的类方法用法分析
Apr 29 Python
Python 输入一个数字判断成绩分数等级的方法
Nov 15 Python
详解Python Matplotlib解决绘图X轴值不按数组排序问题
Aug 05 Python
python3.6、opencv安装环境搭建过程(图文教程)
Nov 05 Python
python 实现视频 图像帧提取
Dec 10 Python
Python如何解除一个装饰器
Aug 07 Python
详解vscode实现远程linux服务器上Python开发
Nov 10 Python
Python实现一个论文下载器的过程
Jan 18 Python
Python万能模板案例之matplotlib绘制直方图的基本配置
Apr 13 Python
python搜索指定目录的方法
Apr 29 #Python
python中sleep函数用法实例分析
Apr 29 #Python
介绍Python中内置的itertools模块
Apr 29 #Python
python使用fileinput模块实现逐行读取文件的方法
Apr 29 #Python
python将字符串转换成数组的方法
Apr 29 #Python
Python中使用hashlib模块处理算法的教程
Apr 28 #Python
简单介绍Python中的struct模块
Apr 28 #Python
You might like
php实现从ftp服务器上下载文件树到本地电脑的程序
2009/02/10 PHP
PHP实现把文本中的URL转换为链接的auolink()函数分享
2014/07/29 PHP
用 Composer构建自己的 PHP 框架之设计 MVC
2014/10/30 PHP
php基于curl扩展制作跨平台的restfule 接口
2015/05/11 PHP
PHP实现数组array转换成xml的方法
2016/07/19 PHP
浅谈javascript原型链与继承
2015/07/13 Javascript
JS+CSS实现另类带提示效果的竖向导航菜单
2015/10/15 Javascript
理解javascript中Map代替循环
2016/02/26 Javascript
jquery实现全选、全不选以及单选功能
2017/03/23 jQuery
详解Nodejs 通过 fs.createWriteStream 保存文件
2017/10/10 NodeJs
JS处理数据四舍五入(tofixed与round的区别详解)
2017/10/26 Javascript
vue cli2.0单页面title修改方法
2018/06/07 Javascript
详解JS浏览器事件循环机制
2019/03/27 Javascript
vue 实现用户登录方式的切换功能
2020/04/14 Javascript
[59:35]DOTA2-DPC中国联赛定级赛 Aster vs DLG BO3第一场 1月8日
2021/03/11 DOTA
python 快速排序代码
2009/11/23 Python
Python中asyncore的用法实例
2014/09/29 Python
python执行使用shell命令方法分享
2017/11/08 Python
Python进阶学习之特殊方法实例详析
2017/12/01 Python
python笔记之mean()函数实现求取均值的功能代码
2019/07/05 Python
pandas 如何分割字符的实现方法
2019/07/29 Python
Java ExcutorService优雅关闭方式解析
2020/05/30 Python
python简单实现插入排序实例代码
2020/12/16 Python
python批量提取图片信息并保存的实现
2021/02/05 Python
CSS3实现swap交换动画
2016/01/19 HTML / CSS
canvas环形倒计时组件的示例代码
2018/06/14 HTML / CSS
Hanro官网:奢华男士和女士内衣、睡衣和家居服
2018/10/25 全球购物
Ariat官网:美国马靴和服装品牌
2019/12/16 全球购物
公司活动策划方案
2014/01/13 职场文书
2014年机关植树节活动方案
2014/02/27 职场文书
校园公益广告语
2014/03/13 职场文书
旅游节目策划方案
2014/05/26 职场文书
小学英语复习计划
2015/01/19 职场文书
2015年派出所工作总结
2015/04/24 职场文书
早安问候语大全
2015/11/10 职场文书
pytorch 实现变分自动编码器的操作
2021/05/24 Python