在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实现文件名批量替换和内容替换
Mar 20 Python
详细讲解用Python发送SMTP邮件的教程
Apr 29 Python
详解Python的collections模块中的deque双端队列结构
Jul 07 Python
基于python的多进程共享变量正确打开方式
Apr 28 Python
python实现跨excel的工作表sheet之间的复制方法
May 03 Python
关于Python的一些学习总结
May 25 Python
Python实现的爬取百度文库功能示例
Feb 16 Python
Python实现的调用C语言函数功能简单实例
Mar 13 Python
Python实现的爬取百度贴吧图片功能完整示例
May 10 Python
对Python中class和instance以及self的用法详解
Jun 26 Python
Python字符串中添加、插入特定字符的方法
Sep 10 Python
python 监控logcat关键字功能
Sep 04 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
第1次亲密接触PHP5(1)
2006/10/09 PHP
十天学会php之第三天
2006/10/09 PHP
PHP 模板高级篇总结
2006/12/21 PHP
php计算两个日期相差天数的方法
2015/03/14 PHP
PHP读取文件的常见几种方法
2016/11/03 PHP
PHP排序算法之堆排序(Heap Sort)实例详解
2018/04/21 PHP
PHP PDOStatement::nextRowset讲解
2019/02/01 PHP
HR vs ForZe BO3 第二场 2.13
2021/03/10 DOTA
自适应高度框架 ----属个人收藏内容
2007/01/22 Javascript
比较详细的javascript对象的property和prototype是什么一种关系
2007/08/06 Javascript
jquery对元素拖动排序示例
2014/01/16 Javascript
jQuery图片旋转插件jQueryRotate.js用法实例(附demo下载)
2016/01/21 Javascript
Node.js 日志处理模块log4js
2016/08/28 Javascript
jQuery的 $.ajax防止重复提交的两种方法(推荐)
2016/10/14 Javascript
es6 字符串String的扩展(实例讲解)
2017/08/03 Javascript
ECMAScript6变量的解构赋值实例详解
2017/09/19 Javascript
微信小程序开发之好友列表字母列表跳转对应位置
2017/09/26 Javascript
Vue修改mint-ui默认样式的方法
2018/02/03 Javascript
VSCode中如何利用d.ts文件进行js智能提示
2018/04/13 Javascript
详解swipe使用及竖屏页面滚动方法
2018/06/28 Javascript
JavaScript函数、闭包、原型、面向对象学习笔记
2018/09/06 Javascript
在vue+element ui框架里实现lodash的debounce防抖
2019/11/13 Javascript
Python转码问题的解决方法
2008/10/07 Python
python+splinter实现12306网站刷票并自动购票流程
2018/09/25 Python
Python中类的创建和实例化操作示例
2019/02/27 Python
opencv python 图片读取与显示图片窗口未响应问题的解决
2020/04/24 Python
html5 Canvas画图教程(6)—canvas里画曲线之arcTo方法
2013/01/09 HTML / CSS
HTML5头部标签的一些常用信息小结
2016/10/23 HTML / CSS
Forever 21美国官网:美国标志性快时尚品牌
2017/02/20 全球购物
幼师自荐信
2013/10/26 职场文书
关于人生的感言
2014/01/17 职场文书
促销活动方案模板
2014/02/24 职场文书
信息与计算机科学职业规划范文:成为一艘有方向的船
2014/09/11 职场文书
北京颐和园导游词
2015/01/30 职场文书
javascript条件式访问属性和箭头函数介绍
2021/11/17 Javascript
Three.js实现雪糕地球的使用示例详解
2022/07/07 Javascript