在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绘制人人网好友关系图示例
Apr 01 Python
Python函数式编程指南(三):迭代器详解
Jun 24 Python
详解Python中最难理解的点-装饰器
Apr 03 Python
python记录程序运行时间的三种方法
Jul 14 Python
python数据类型判断type与isinstance的区别实例解析
Oct 31 Python
Python设计模式之命令模式简单示例
Jan 10 Python
python3.4控制用户输入与输出的方法
Oct 17 Python
python使用for循环计算0-100的整数的和方法
Feb 01 Python
解决python有时候import不了当前的包问题
Aug 28 Python
python爬虫可以爬什么
Jun 16 Python
推荐技术人员一款Python开源库(造数据神器)
Jul 08 Python
解决Pycharm 中遇到Unresolved reference 'sklearn'的问题
Jul 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
标准版Eclipse搭建PHP环境的详细步骤
2015/11/18 PHP
PHP 根据key 给二维数组分组
2016/12/09 PHP
php利用array_search与array_column实现二维数组查找
2019/07/08 PHP
event.keyCode键码值表 附只能输入特定的字符串代码
2009/05/15 Javascript
Javascript学习笔记之相等符号与严格相等符号
2014/11/23 Javascript
利用jquery实现瀑布流3种案例
2016/09/18 Javascript
Bootstrap作品展示站点实战项目2
2016/10/14 Javascript
jQuery web 组件 后台日历价格、库存设置的代码
2016/10/14 Javascript
基于ajax与msmq技术的消息推送功能实现代码
2016/12/26 Javascript
Node.js Koa2使用JWT进行鉴权的方法示例
2018/08/17 Javascript
js实现文件上传功能 后台使用MultipartFile
2018/09/08 Javascript
详细分析Node.js 模块系统
2020/06/28 Javascript
Vue 请求传公共参数的操作
2020/07/31 Javascript
[51:50]完美世界DOTA2联赛 Magma vs GXR 第一场 11.07
2020/11/10 DOTA
python实现随机密码字典生成器示例
2014/04/09 Python
python获取本地计算机名字的方法
2015/04/29 Python
Python中使用不同编码读写txt文件详解
2015/05/28 Python
使用python实现个性化词云的方法
2017/06/16 Python
python web.py开发httpserver解决跨域问题实例解析
2018/02/12 Python
Windows平台Python编程必会模块之pywin32介绍
2019/10/01 Python
Python使用Opencv实现图像特征检测与匹配的方法
2019/10/30 Python
Python class的继承方法代码实例
2020/02/14 Python
使用OpenCV去除面积较小的连通域
2020/07/05 Python
Python-split()函数实例用法讲解
2020/12/18 Python
美国韩国化妆品和护肤品购物网站:Beautytap
2018/07/29 全球购物
Smilodox官方运动服装店:从运动服到健身配件
2020/08/27 全球购物
某公司C#程序员面试题笔试题
2014/05/26 面试题
商学院大学生求职的自我评价
2014/03/12 职场文书
学习党的群众路线对照检查材料
2014/09/29 职场文书
暑假安全保证书
2015/02/28 职场文书
原料仓管员岗位职责
2015/04/01 职场文书
爱国主题班会教案
2015/08/14 职场文书
2016年小学六一儿童节活动总结
2016/04/06 职场文书
在pyCharm中下载第三方库的方法
2021/04/18 Python
Django rest framework如何自定义用户表
2021/06/09 Python
Ruby处理YAML和json数据
2022/04/18 Ruby