前言
python提供了几个对于XML文件进行处理的模块,包括:
xml.etree.ElementTree
xml.dom
xml.dom.minidom
xml.dom.pulldom
xml.sax
xml.parsers.expat
本文主要介绍xml.etree.ElementTree(简称ET)模块,它是一个简单而轻量级的XML处理器。
关于XML文件的相关知识:
参考链接
ET模块的简述
XML是一种分层数据格式,最自然的表示方法是使用树。
为此, ET 有两个类分别是ElementTree 和Element 。 ElementTree 将整个XML文档表示为一个树, Element 表示该树中的单个节点。与整个文档的交互(读写文件)通常在 ElementTree 上完成。与单个XML元素及其子元素的交互是在 Element上 完成的。
使用以下的XML文件作为例子:其文件名是:country_data.xml
<?xml version="1.0"?>
<data><country name="Liechtenstein"><rank>1</rank><year>2008</year><gdppc>141100</gdppc><neighbor name="Austria" direction="E"/><neighbor name="Switzerland" direction="W"/></country><country name="Singapore"><rank>4</rank><year>2011</year><gdppc>59900</gdppc><neighbor name="Malaysia" direction="N"/></country><country name="Panama"><rank>68</rank><year>2011</year><gdppc>13600</gdppc><neighbor name="Costa Rica" direction="W"/><neighbor name="Colombia" direction="E"/></country>
</data>
分析XML文件可以看出根结点是data标签,里面有三个country标签的子结点,每个country标签下有四个不同的描述参数。
读取XML文件
import xml.etree.ElementTree as ET
tree = ET.parse('country_data.xml')
这里返回的tree是一个 ElementTree 类型的实例对象,将整个XML文档表示为一个树。
获取里面的元素
获取根结点元素
root = tree.getroot()
作为 Element , root 具有标签和属性字典,字典里存放关键字和值:
>>> root.tag
'data'
>>> root.attrib #这里的data标签没有对应的属性,故输出的dic是空{}
{
}
根据标签获取对应的元素:
>>>for country in tree.findall('country'):print(country.attrib){
'name': 'Liechtenstein'}
{
'name': 'Singapore'}
{
'name': 'Panama'}
根据标签名称所有匹配的直接子元素。按文档顺序返回包含所有匹配元素的列表。
例如上面的代码是查找tree下标签为country的子结点,共三个。
若改为
>>>for country in tree.findall('neighbor'):print(neighbor.attrib)
则没有输出,因为neighbor标签对应的元素不是tree的直接子结点,而是每个country的直接子结点。
用root.findall结果与tree.findall相同,如下:
>>>for country in root.findall('country'):print(country.attrib){
'name': 'Liechtenstein'}
{
'name': 'Singapore'}
{
'name': 'Panama'}
官方文档说明:API手册