在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实现类继承实例
Jul 04 Python
python3序列化与反序列化用法实例
May 26 Python
菜鸟使用python实现正则检测密码合法性
Jan 05 Python
老生常谈Python之装饰器、迭代器和生成器
Jul 26 Python
Python读取视频的两种方法(imageio和cv2)
Apr 15 Python
tensorflow学习教程之文本分类详析
Aug 07 Python
使用Django2快速开发Web项目的详细步骤
Jan 06 Python
Python在OpenCV里实现极坐标变换功能
Sep 02 Python
tensorflow多维张量计算实例
Feb 11 Python
pycharm 中mark directory as exclude的用法详解
Feb 14 Python
Python3实现个位数字和十位数字对调, 其乘积不变
May 03 Python
python绘制高斯曲线
Feb 19 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下几种删除目录的方法总结
2007/08/19 PHP
深思 PHP 数组遍历的差异(array_diff 的实现)
2008/03/23 PHP
PHP中几个可以提高运行效率的代码写法、技巧分享
2014/08/21 PHP
php版微信公众账号第三方管理工具开发简明教程
2016/09/23 PHP
php unicode编码和字符串互转的方法
2020/08/12 PHP
JavaScript 快捷键设置实现代码
2009/03/13 Javascript
javascript一个无懈可击的实例化XMLHttpRequest的方法
2010/10/13 Javascript
jquery提交form表单时禁止重复提交的方法
2014/02/13 Javascript
css与javascript跨浏览器兼容性总结
2014/09/15 Javascript
使用jQuery实现星级评分代码分享
2014/12/09 Javascript
jquery搜索框效果实现方法
2015/01/16 Javascript
Jquery日期选择datepicker插件用法实例分析
2015/06/08 Javascript
javascript 中的 delete及delete运算符
2015/11/15 Javascript
vue学习笔记之vue1.0和vue2.0的区别介绍
2017/05/17 Javascript
js获取地址栏参数的两种方法
2017/06/27 Javascript
jQuery Form插件使用详解_动力节点Java学院整理
2017/07/17 jQuery
js 概率计算(简单版)
2017/09/12 Javascript
基于openlayers实现角度测量功能
2020/09/28 Javascript
Python利用带权重随机数解决抽奖和游戏爆装备问题
2016/06/16 Python
Python中的取模运算方法
2018/11/10 Python
Linux下Python安装完成后使用pip命令的详细教程
2018/11/22 Python
Python3 合并二叉树的实现
2019/09/30 Python
解决python虚拟环境切换无效的问题
2020/04/30 Python
Python3利用openpyxl读写Excel文件的方法实例
2021/02/03 Python
PyCharm 光标变成黑块的解决方式
2021/02/06 Python
python 第三方库paramiko的常用方式
2021/02/20 Python
HTML5 Web存储方式的localStorage和sessionStorage进行数据本地存储案例应用
2012/12/09 HTML / CSS
宝拉珍选官方旗舰店:2%水杨酸精华液,收缩毛孔粗大和祛痘
2018/07/01 全球购物
护理专业优质毕业生自荐书
2014/01/31 职场文书
《春晓》教学反思
2014/04/20 职场文书
审计专业自荐信范文
2014/04/21 职场文书
8和9的加减法教学反思
2014/05/01 职场文书
教师爱岗敬业演讲稿
2014/05/05 职场文书
小学语文教研活动总结
2014/07/01 职场文书
机械机修工岗位职责
2014/08/03 职场文书
浅谈由position属性引申的css进阶讨论
2021/05/25 HTML / CSS