视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Python中使用ElementTree解析XML示例
2020-11-27 14:33:54 责编:小采
文档


【XML基本概念介绍】

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


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


概念二:
代码如下:


# 元素可以嵌套到任意参次
# bar元素为foo元素的子元素
# 父元素foo的结束标签


概念三:
代码如下:


# foo元素有个lang的属性,该属性值为: EN;对应Python字典(Name-Value)对;
# bar元素有个lang的属性,该属性值为: CH;还有个id属性,值为:001,放置在''或“”中;
# bar元素中的lang属性不会和foo元素中相冲突,每个元素都有的属性集;

概念四:
代码如下:


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


概念五:
代码如下:


# info元素为根节点
A # list元素为子节点
B
C


概念六:
代码如下:


# 可以通过声明xmlns来定义默认名字空间,feed元素处于http://www.w3.org/2005/Atom命名空间中
dive into mark # title元素也是。名字空间声明不仅会作用于当前声明它的元素,还会影响到该元素的所有子元素

也可以通过xmlns:prefix声明来定义一个名字空间并取其名为prefix。
然后该名字空间中的每个元素都必须显式地使用这个前缀(prefix)来声明。
# feed属于命名空间atom
dive into mark # title元素同样属于该命名空间
# 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"?>

Book message

bookone
python check
001
200


booktwo
python learn
002
300



###########
## 加载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
==============================

下载本文
显示全文
专题