在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迭代和迭代器详解
Nov 10 Python
python模块之re正则表达式详解
Feb 03 Python
Python实现将Excel转换为json的方法示例
Aug 05 Python
PyQt5每天必学之进度条效果
Apr 19 Python
python实现随机梯度下降法
Mar 24 Python
在Python中实现替换字符串中的子串的示例
Oct 31 Python
python web自制框架之接受url传递过来的参数实例
Dec 17 Python
python中p-value的实现方式
Dec 16 Python
pytorch中图像的数据格式实例
Feb 11 Python
.img/.hdr格式转.nii格式的操作
Jul 01 Python
详解如何用Python实现感知器算法
Jun 18 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 strstr查找字符串中是否包含某些字符的查找函数
2010/06/03 PHP
PHP删除数组中特定元素的两种方法
2013/07/02 PHP
javascript document.images实例
2008/05/27 Javascript
JavaScript 组件之旅(一)分析和设计
2009/10/28 Javascript
JScript中的条件注释详解
2015/04/24 Javascript
HTML5实现留言和回复页面样式
2015/07/22 Javascript
javascript数据结构之双链表插入排序实例详解
2015/11/25 Javascript
Bootstrap模仿起筷首页效果
2016/05/09 Javascript
Js获取图片原始宽高的实现代码
2016/05/17 Javascript
jQuery实现每隔几条元素增加1条线的方法
2016/06/27 Javascript
javascript深拷贝(deepClone)详解
2016/08/24 Javascript
JavaScript利用正则表达式替换字符串中的内容
2016/12/12 Javascript
AngularJS定时器的使用与移除操作方法【interval与timeout】
2016/12/14 Javascript
原生JS获取元素集合的子元素宽度实例
2016/12/14 Javascript
用director.js实现前端路由使用实例
2017/01/27 Javascript
vue获取form表单的值示例
2019/10/29 Javascript
vue实现学生信息管理系统
2020/05/30 Javascript
Vue+penlayers实现多边形绘制及展示
2020/12/24 Vue.js
[02:30]DOTA2放量测试专访海涛:呼吁保护新手玩家
2013/08/26 DOTA
Django静态资源URL STATIC_ROOT的配置方法
2014/11/08 Python
朴素贝叶斯算法的python实现方法
2014/11/18 Python
Python简单连接MongoDB数据库的方法
2016/03/15 Python
python遍历目录的方法小结
2016/04/28 Python
rabbitmq(中间消息代理)在python中的使用详解
2017/12/14 Python
python调用OpenCV实现人脸识别功能
2018/05/25 Python
pandas 按照特定顺序输出的实现代码
2018/07/10 Python
python里dict变成list实例方法
2019/06/26 Python
python买卖股票的最佳时机(基于贪心/蛮力算法)
2019/07/05 Python
Pycharm Available Package无法显示/安装包的问题Error Loading Package List解决
2020/09/18 Python
带有css3动画效果的兼容多浏览器简单导航条示例
2014/01/26 HTML / CSS
Html5在手机端调用相机的方法实现
2020/05/13 HTML / CSS
物业管理公司实习生自我鉴定
2013/09/19 职场文书
2014年社区工作总结
2014/11/18 职场文书
校本课程教学计划
2015/01/19 职场文书
推荐信范文大全
2015/03/27 职场文书
redis sentinel监控高可用集群实现的配置步骤
2022/04/01 Redis