Python中使用ElementTree解析XML示例


Posted in Python onJune 02, 2015

【XML基本概念介绍】

XML 指可扩展标记语言(eXtensible Markup Language)。
XML 被设计用来传输和存储数据。
概念一:

<foo>      # foo元素的起始标签  

</foo>     # foo元素的结束标签  

           # note: 每一个起始标签必须有对应的结束标签来闭合, 也可以写成<foo/> 

概念二:
<foo>           # 元素可以嵌套到任意参次  

  <bar></bar>   # bar元素为foo元素的子元素  

</foo>          # 父元素foo的结束标签 

概念三:
<foo lang='EN'>                  # foo元素有个lang的属性,该属性值为: EN;对应Python字典(Name-Value)对;                              

  <bar id='001' lang="CH"></bar> # bar元素有个lang的属性,该属性值为: CH;还有个id属性,值为:001,放置在''或“”中;   

</foo>                           # bar元素中的lang属性不会和foo元素中相冲突,每个元素都有独立的属性集;

概念四:

<title>Learning Python</title> # 元素可以有文本内容  

                                # Note:如果一个元素即没有文本内容,也没有子元素,则为空元素。 

概念五:
<info>                                  # info元素为根节点  

    <list id='001'> A </list>           # list元素为子节点  

    <list id='002'> B </list>   

    <list id='003'> C </list>  

</info> 

概念六:
<feed xmlns='http://www.w3.org/2005/Atom'>  # 可以通过声明xmlns来定义默认名字空间,feed元素处于http://www.w3.org/2005/Atom命名空间中  

  <title>dive into mark</title>             # title元素也是。名字空间声明不仅会作用于当前声明它的元素,还会影响到该元素的所有子元素  

</feed>  

也可以通过xmlns:prefix声明来定义一个名字空间并取其名为prefix。

然后该名字空间中的每个元素都必须显式地使用这个前缀(prefix)来声明。

<atom:feed xmlns:atom='http://www.w3.org/2005/Atom'>  # feed属于命名空间atom  

  <atom:title>dive into mark</atom:title>             # title元素同样属于该命名空间             

</atom:feed>                                          # xmlns(XML Name Space) 

【XML几种解析方法】

常见的XML编程接口有DOM和SAX,这两种接口处理XML文件的方式不同,使用场合自然也就不同。

Python有三种方法解析XML: SAX,DOM,以及ElementTree:

1.SAX (Simple API for XML )

Pyhton标准库包含SAX解析器,SAX用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件。SAX是一种基于事件驱动的API。利用SAX解析XML文档牵涉到两个部分:解析器和事件处理器。
解析器负责读取XML文档,并向事件处理器发送事件,如元素开始及结束事件;而事件处理器则负责对事件作出处理。
优点:SAX流式读取XML文件,比较快,占用内存少。
缺点:需要用户实现回调函数(handler)。

2.DOM(Document Object Model)

将XML数据在内存中解析成一个树,通过对树的操作来操作XML。一个DOM的解析器在解析一个XML文档时,一次性读取整个文档,把文档中所有元素保存在内存中的一个树结构里,之后你可以利用DOM提供的不同的函数来读取或修改文档的内容和结构,也可以把修改过的内容写入xml文件。
优点:使用DOM的好处是你不需要对状态进行追踪,因为每一个节点都知道谁是它的父节点,谁是子节点.
缺点:DOM需要将XML数据映射到内存中的树,一是比较慢,二是比较耗内存,使用起来也比较麻烦!

3.ElementTree(元素树)

ElementTree就像一个轻量级的DOM,具有方便友好的API。代码可用性好,速度快,消耗内存少。
相比而言,第三种方法,即方便,又快速,我们一直用它!下面介绍用元素树如何解析XML:

【ElementTree解析】

两种实现

ElementTree生来就是为了处理XML ,它在Python标准库中有两种实现。
一种是纯Python实现,例如: xml.etree.ElementTree
另外一种是速度快一点的:   xml.etree.cElementTree
尽量使用C语言实现的那种,因为它速度更快,而且消耗的内存更少! 在程序中可以这样写:

try:  

    import xml.etree.cElementTree as ET  

except ImportError:  

    import xml.etree.ElementTree as ET 

常用方法
# 当要获取属性值时,用attrib方法。  

# 当要获取节点值时,用text方法。  

# 当要获取节点名时,用tag方法。 

示例XML

<?xml version="1.0" encoding="utf-8"?>  

<info>  

   <intro>Book message</intro>  

    <list id='001'>  

        <head>bookone</head>  

        <name>python check</name>  

        <number>001</number>  

        <page>200</page>  

    </list>  

    <list id='002'>  

        <head>booktwo</head>  

        <name>python learn</name>  

        <number>002</number>  

        <page>300</page>  

    </list>  

</info> 

###########
##  加载XML
###########

方法一:加载文件

root = ET.parse('book.xml') 

方法二:加载字符串
root = ET.fromstring(xmltext)

###########
## 获取节点
###########

方法一:获得指定节点->getiterator()方法

book_node = root.getiterator('list')

方法二:获得指定节点->findall()方法
book_node = root.findall('list') 

方法三:获得指定节点->find()方法
book_node = root.find('list') 

方法四:获得儿子节点->getchildren()
for node in book_node:  

    book_node_child = node.getchildren()[0]  

    print book_node_child.tag, '=> ', book_node_child.text

 

###########
##  例子01
###########

# coding=utf-8  

  

try:                                           # 导入模块  

    import xml.etree.cElementTree as ET  

except ImportError:  

    import xml.etree.ElementTree as ET  

  

root   = ET.parse('book.xml')                 # 分析XML文件  

books  = root.findall('/list')                # 查找所有根目录下的list的子节点  

for book_list in books:                       # 对查找后的结果遍历  

    print "=" * 30                            # 输出格式             

    for book in book_list:                    # 对每个子节点再进行遍历,找出里面你的属性及值                       

        if book.attrib.has_key('id'):         # 一句id来做条件判断  

            print "id:", book.attrib['id']    # 根据id打印出属性值  

        print book.tag + '=> ' + book.text    # 输出标签及文本内容  

print "=" * 30 

输出结果:
==============================  

head=> bookone  

name=> python check  

number=> 001  

page=> 200  

==============================  

head=> booktwo  

name=> python learn  

number=> 002  

page=> 300  

============================== 
Python 相关文章推荐
Python实现注册登录系统
Aug 08 Python
Windows下Python3.6安装第三方模块的方法
Nov 22 Python
python运行时强制刷新缓冲区的方法
Jan 14 Python
python使用for循环计算0-100的整数的和方法
Feb 01 Python
Python中正则表达式的用法总结
Feb 22 Python
django配置连接数据库及原生sql语句的使用方法
Mar 03 Python
python实现ip地址查询经纬度定位详解
Aug 30 Python
python日期与时间戳的各种转换示例
Feb 12 Python
Python 排序最长英文单词链(列表中前一个单词末字母是下一个单词的首字母)
Dec 14 Python
Python学习之time模块的基本使用
Jan 17 Python
教你怎么用python selenium实现自动化测试
May 27 Python
基于Python和openCV实现图像的全景拼接详细步骤
Oct 05 Python
Python文档生成工具pydoc使用介绍
Jun 02 #Python
自己使用总结Python程序代码片段
Jun 02 #Python
python执行子进程实现进程间通信的方法
Jun 02 #Python
Python多进程并发(multiprocessing)用法实例详解
Jun 02 #Python
使用pdb模块调试Python程序实例
Jun 02 #Python
python使用xmlrpclib模块实现对百度google的ping功能
Jun 02 #Python
python基于xmlrpc实现二进制文件传输的方法
Jun 02 #Python
You might like
PHP在XP下IIS和Apache2服务器上的安装
2006/09/05 PHP
PHP脚本的10个技巧(6)
2006/10/09 PHP
MySQL连接数超过限制的解决方法
2011/07/17 PHP
PHP 提取图片img标记中的任意属性的简单实例
2013/12/10 PHP
php+mysql+ajax实现单表多字段多关键词查询的方法
2017/04/15 PHP
利用php获得flv视频长度的实例代码
2017/10/26 PHP
浅谈laravel aliases别名的原理
2019/10/24 PHP
Laravel5.5 动态切换多语言的操作方式
2019/10/25 PHP
个人总结的一些关于String、Function、Array的属性和用法
2007/01/10 Javascript
jQuery Ajax 全解析
2009/02/08 Javascript
UserData用法总结 lanyu出品
2010/07/01 Javascript
jBox 2.3基于jquery的最新多功能对话框插件 常见使用问题解答
2011/11/10 Javascript
jQuery 事件的命名空间简单了解
2013/11/22 Javascript
实例说明为什么不要行内使用javascript
2014/04/18 Javascript
node.js中的fs.truncate方法使用说明
2014/12/15 Javascript
node操作mysql数据库实例详解
2017/03/17 Javascript
微信小程序实战之顶部导航栏(选项卡)(1)
2020/06/19 Javascript
js实现本地时间同步功能
2017/08/26 Javascript
Vue.js表单标签中的单选按钮、复选按钮和下拉列表的取值问题
2017/11/22 Javascript
《javascript设计模式》学习笔记四:Javascript面向对象程序设计链式调用实例分析
2020/04/07 Javascript
Python中使用glob和rmtree删除目录子目录及所有文件的例子
2014/11/21 Python
在Python中测试访问同一数据的竞争条件的方法
2015/04/23 Python
详解Python中的动态属性和特性
2018/04/07 Python
python实现彩票系统
2020/06/28 Python
Python获取浏览器窗口句柄过程解析
2020/07/25 Python
纯CSS3制作漂亮带动画效果的主机价格表
2015/04/25 HTML / CSS
澳大利亚领先的宠物用品商店:VetSupply
2017/09/08 全球购物
Vita Fede官网:在意大利手工制作,在纽约市设计
2019/10/25 全球购物
介绍一下Make? 为什么使用make
2016/07/31 面试题
美发活动策划书
2014/01/14 职场文书
酒吧创业计划书
2014/01/18 职场文书
自动化专业大学生职业生涯规划范文:爱拚才会赢
2014/09/12 职场文书
教师思想作风整顿个人剖析材料
2014/10/10 职场文书
2014年学前班工作总结
2014/12/08 职场文书
初中数学教学反思范文
2016/02/17 职场文书
Java生成读取条形码和二维码的简单示例
2021/07/09 Java/Android