更新中..
简介
xml.etree.ElementTree
实现了一个简洁有效的用于解析和新建XML数据的API。其也被简称为ET
。
弃用: xml.etree.cElementTree
自Python==3.3已被弃用
警告:使用时需注意恶意构建的数据,请防范XML漏洞
概念
XML 是一种继承性的分层数据格式,常用树来表示。
ET
有两个类,ElementTree 和 Element.
通常将ElementTree对应整个XML,而Element则对应单个XML元素。
注: 本文一般将'element'翻译为“元素”。
解析XML
假设如下虚构的数据被储存在目录 country_data.xml
下。
<?xml version="1.0"?>
<data>
<country name="列支敦士登">
<rank>1</rank>
<year>2008</year>
<gdppc>141100</gdppc>
<neighbor name="奥地利" direction="E"/>
<neighbor name="瑞士" direction="W"/>
</country>
<country name="新加坡">
<rank>4</rank>
<year>2011</year>
<gdppc>59900</gdppc>
<neighbor name="马来西亚" direction="N"/>
</country>
<country name="巴拿马">
<rank>68</rank>
<year>2011</year>
<gdppc>13600</gdppc>
<neighbor name="哥斯达黎加" direction="W"/>
<neighbor name="哥伦比亚" direction="E"/>
</country>
</data>
将该XML使用ET解析的方法有两种,从文件直接导入和从字符串解析。
a. 从文件导入
import xml.etree.ElementTree as ET
tree = ET.parse('country_data.xml')
root = tree.getroot()
可以看到,tree与root分别是ElementTree和Element
b. 从字符串导入
假设该虚拟数据已被导入计算机内存,存储在名为data_str
的字符串变量中,则
import xml.etree.ElementTree as ET
root = ET.fromstring(data_str)
可以看到,由字符串解析得到的直接就是Element对象
Element类
tag
字符串,表示该Element的类型
text 与 tail
text
可以理解为该元素起始标签之后跟随的非标签内容
tail
可以理解为该元素结束标签之后跟随的非标签内容
例如
<a><b>1<c>2<d/>3</c></b>4</a>
元素 i | <i> 后续内容 即text |
</i> 后续内容 即tail |
---|---|---|
a | 无 | 无 |
b | "1" | "4" |
c | "2" | 无 |
d | 无 | "3" |
attrib
字典,包含了该元素的属性
attribStringExample = ' <neighbor name="奥地利" direction="E"/> '
ele1 = ET.fromstring(attribStringExample)
print(ele1.attrib)
输出{'name': '奥地利', 'direction': 'E'}
get(key, default=None)
从attrib字典中根据key获取值,若未找到则返回default指定的值
v = ele1.get(key, default=None)
# 相当于:
v = ele1.attrib[key] if key in ele1.attrib.keys() else default
items() 与 keys()
从atrrib字典获取键值对、键
set(key, value)
设置元素属性
相当于
ele1.attrib[key]=value
find(match, namespaces=None), findall(match, namespaces=None), findtext(match, default=None, namespaces=None)
分别为
- 查找以当前元素为父元素(父节点)的所有子元素(子节点)中与match匹配的第一个子元素,match可以是tag名称或者path
- 查找出所有匹配的结果,其他同上
- 返回第一个匹配的子元素的text,其他同find()