在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中使用不同编码读写txt文件详解
May 28 Python
python结合opencv实现人脸检测与跟踪
Jun 08 Python
解决python中使用plot画图,图不显示的问题
Jul 04 Python
python redis 批量设置过期key过程解析
Nov 26 Python
python:目标检测模型预测准确度计算方式(基于IoU)
Jan 18 Python
Python使用enumerate获取迭代元素下标
Feb 03 Python
django使用graphql的实例
Sep 02 Python
MoviePy简介及Python视频剪辑自动化
Dec 18 Python
Python关于拓扑排序知识点讲解
Jan 04 Python
python生成word合同的实例方法
Jan 12 Python
python opencv人脸识别考勤系统的完整源码
Apr 26 Python
python在package下继续嵌套一个package
Apr 14 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
新闻分类录入、显示系统
2006/10/09 PHP
PHP 文件扩展名 获取函数
2009/06/03 PHP
php安全之直接用$获取值而不$_GET 字符转义
2012/06/03 PHP
php中Snoopy类用法实例
2015/06/19 PHP
浅谈PHP接入(第三方登录)QQ登录 OAuth2.0 过程中遇到的坑
2017/10/13 PHP
javascript面向对象的方式实现的弹出层效果代码
2010/01/28 Javascript
js通过八个点 拖动改变div大小的实现方法
2014/03/05 Javascript
JS实现密码框根据焦点的获取与失去控制文字的消失与显示效果
2015/11/26 Javascript
node.js入门实例helloworld详解
2015/12/23 Javascript
如何使用vuejs实现更好的Form validation?
2017/04/07 Javascript
js图片轮播插件的封装
2017/07/21 Javascript
微信小程序之蓝牙的链接
2017/09/26 Javascript
微信上传视频文件提示(推荐)
2018/11/22 Javascript
NodeJS 文件夹拷贝以及删除功能
2019/09/03 NodeJs
vue实现表单未编辑或未保存离开弹窗提示功能
2020/04/08 Javascript
[03:41]DOTA2上海特锦赛小组赛第三日recap精彩回顾
2016/02/28 DOTA
[57:37]EG vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python批量提交沙箱问题实例
2014/10/08 Python
Python引用传值概念与用法实例小结
2017/10/07 Python
对pandas中两种数据类型Series和DataFrame的区别详解
2018/11/12 Python
Python中的枚举类型示例介绍
2019/01/09 Python
Python析构函数__del__定义原理解析
2020/11/20 Python
澳大利亚婴儿喂养品牌:Cherub Baby
2018/11/01 全球购物
英国的领先快速时尚零售商:In The Style
2019/03/25 全球购物
自荐信模版
2013/10/24 职场文书
学生党员思想汇报范文
2014/01/09 职场文书
菜篮子工程实施方案
2014/03/08 职场文书
售后服务承诺书怎么写
2014/05/21 职场文书
安全资料员岗位职责范本
2014/06/28 职场文书
2014年党课学习心得体会
2014/07/08 职场文书
法院干警四风问题个人对照检查材料思想汇报
2014/10/07 职场文书
免职证明样本
2014/10/23 职场文书
2015医院个人工作总结范文
2015/05/21 职场文书
2015年教研室工作总结范文
2015/05/23 职场文书
感恩教师节主题班会
2015/08/12 职场文书
2016年大学生暑期社会实践活动总结
2016/04/06 职场文书