在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中for循环和while循环的基本使用方法
Aug 21 Python
Python实现的科学计算器功能示例
Aug 04 Python
matplotlib subplots 调整子图间矩的实例
May 25 Python
Python爬虫之网页图片抓取的方法
Jul 16 Python
Python中使用遍历在列表中添加字典遇到的坑
Feb 27 Python
Python  Django 母版和继承解析
Aug 09 Python
Python字符串中删除特定字符的方法
Jan 15 Python
Android Q之气泡弹窗的实现示例
Jun 23 Python
python实现粒子群算法
Oct 15 Python
关于python tushare Tkinter构建的简单股票可视化查询系统(Beta v0.13)
Oct 19 Python
python 解决Windows平台上路径有空格的问题
Nov 10 Python
十个Python自动化常用操作,即拿即用
May 10 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
smarty+adodb+部分自定义类的php开发模式
2006/12/31 PHP
php的chr和ord函数实现字符加减乘除运算实现代码
2011/12/05 PHP
ThinkPHP中的create方法与自动令牌验证实例教程
2014/08/22 PHP
PHP实现求解最长公共子串问题的方法
2017/11/17 PHP
列表内容的选择
2006/06/30 Javascript
JavaScript中判断函数是new还是()调用的区别说明
2011/04/07 Javascript
提高javascript效率 一次判断,而不要次次判断
2012/03/30 Javascript
jQuery Ajax提交表单查询获得数据实例代码
2012/09/19 Javascript
jquery内置验证(validate)使用方法示例(表单验证)
2013/12/04 Javascript
js使下拉列表框可编辑不止是选择
2013/12/12 Javascript
js的window.showModalDialog及window.open用法实例分析
2015/01/29 Javascript
javascript HTML5 canvas实现打砖块游戏
2020/06/18 Javascript
jquery实现无刷新验证码的简单实例
2016/05/19 Javascript
js enter键激发事件实例代码
2016/08/17 Javascript
JS实现点击Radio动态更新table数据
2017/07/18 Javascript
vue中简单弹框dialog的实现方法
2018/02/26 Javascript
JavaScript数组去重的几种方法
2019/04/07 Javascript
Vue.js递归组件实现组织架构树和选人功能
2019/07/04 Javascript
Vue实现Layui的集成方法步骤
2020/04/10 Javascript
vue.js封装switch开关组件的操作
2020/10/26 Javascript
[04:03]2014DOTA2西雅图国际邀请赛 LGD战队巡礼
2014/07/07 DOTA
python 出现SyntaxError: non-keyword arg after keyword arg错误解决办法
2017/02/14 Python
pytorch+lstm实现的pos示例
2020/01/14 Python
python使用numpy实现直方图反向投影示例
2020/01/17 Python
python实现ftp文件传输系统(案例分析)
2020/03/20 Python
Python生成器next方法和send方法区别详解
2020/05/30 Python
Tensorflow使用Anaconda、pycharm安装记录
2020/07/29 Python
Python 找出英文单词列表(list)中最长单词链
2020/12/14 Python
小学生防溺水广播稿
2014/01/12 职场文书
餐厅销售主管职责范本
2014/02/19 职场文书
党员群众路线学习心得体会
2014/11/04 职场文书
主持稿开场白
2015/06/01 职场文书
七年级数学教学反思
2016/02/17 职场文书
详解Mysql 函数调用优化
2021/04/07 MySQL
Java面试题冲刺第十七天--基础篇3
2021/08/07 面试题