在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 相关文章推荐
Django中对通过测试的用户进行限制访问的方法
Jul 23 Python
Python字符串、元组、列表、字典互相转换的方法
Jan 23 Python
Python进阶_关于命名空间与作用域(详解)
May 29 Python
Python人脸识别初探
Dec 21 Python
python merge、concat合并数据集的实例讲解
Apr 12 Python
关于Pycharm无法debug问题的总结
Jan 19 Python
python使用tkinter库实现五子棋游戏
Jun 18 Python
Python qqbot 实现qq机器人的示例代码
Jul 11 Python
解决Mac下使用python的坑
Aug 13 Python
Python树莓派学习笔记之UDP传输视频帧操作详解
Nov 15 Python
深入浅析python的第三方库pandas
Feb 13 Python
pytorch 梯度NAN异常值的解决方案
Jun 05 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
德劲1104的电路分析与改良
2021/03/01 无线电
openflashchart 2.0 简单案例php版
2012/05/21 PHP
探讨file_get_contents与curl效率及稳定性的分析
2013/06/06 PHP
CodeIgniter使用smtp服务发送html邮件的方法
2015/06/10 PHP
PHP使用DOM和simplexml读取xml文档的方法示例
2017/02/08 PHP
php使用PDO事务配合表格读取大量数据插入操作实现方法
2017/02/16 PHP
PHP实现Unicode编码相互转换的方法示例
2020/11/17 PHP
Laravel实现定时任务的示例代码
2017/08/10 PHP
PHP并发场景的三种解决方案代码实例
2021/02/27 PHP
使javascript也能包含文件
2006/10/26 Javascript
关于URL中的特殊符号使用介绍
2011/11/03 Javascript
JQuery选择器、过滤器大整理
2015/05/26 Javascript
JavaScript中函数声明与函数表达式的区别详解
2016/08/18 Javascript
Jquery Easyui搜索框组件SearchBox使用详解(19)
2016/12/17 Javascript
Bootstrap Table 在指定列中添加下拉框控件并获取所选值
2017/07/31 Javascript
JavaScript中防止微信浏览器被整体拖动的方法
2017/08/25 Javascript
layui type2 通过url给iframe子页面传值的例子
2019/09/06 Javascript
微信小程序录音实现功能并上传(使用node解析接收)
2020/02/26 Javascript
javaScript代码飘红报错看不懂?读完这篇文章再试试
2020/08/19 Javascript
[01:22:42]2014 DOTA2华西杯精英邀请赛 5 24 DK VS LGD
2014/05/26 DOTA
[03:46]DAC趣味视频-中文考试.mp4
2017/04/02 DOTA
Python可跨平台实现获取按键的方法
2015/03/05 Python
MySQL中表的复制以及大型数据表的备份教程
2015/11/25 Python
python+matplotlib实现动态绘制图片实例代码(交互式绘图)
2018/01/20 Python
pytorch 实现张量tensor,图片,CPU,GPU,数组等的转换
2020/01/13 Python
如何用python写个模板引擎
2021/01/14 Python
深入解析HTML5使用SVG图像时的viewBox属性用法
2015/09/02 HTML / CSS
详解canvas绘制网络字体几种方法
2019/08/27 HTML / CSS
商务英语大学生职业生涯规划书范文
2014/01/01 职场文书
行政人事经理职位说明书
2014/03/05 职场文书
创先争优活动党员公开承诺书
2014/08/29 职场文书
出售房屋协议书范本
2014/10/06 职场文书
2016年三八节红领巾广播稿
2015/12/17 职场文书
2019年消防宣传标语集锦
2019/11/21 职场文书
PHP基本语法
2021/03/31 PHP
Linux中一对多配置日志服务器的详细步骤
2022/07/23 Servers