xml.etree.ElementTree — The ElementTree XML API 中文翻译

Python:2.7.8

源码地址:Lib/xml/etree/ElementTree.py

Element是一种灵活的容器对象,用于在内存中储存分层数据结构。你可以想象它是字典和列表的交集。

警告:xml.etree.ElementTree在处理恶意构造的数据时是不安全的。如果你需要处理不可信或未验证的数据,请查看 XML vulnerabilities

元素(element)拥有若干相关的属性:

1、标签(tag),用于标识元素中的数据代表着什么的字符串;

2、属性(attributes),储存在Python字典里;

3、文本内容;

4,可选的尾字符串;

5,若干子元素,储存才Python序列里;

创建element实例,可使用Element构造函数,或者使用内建函数SubElement()。

ElementTree类用于将element打包为XML文件,或从XML文件中读取element。

1.1. XML树和元素

XML是一种可继承的,分层的的数据格式,为了更好的理解它,你可以想想“树”的结构。xml.etree下面有两个类,第一个是ElementTree类,用于将整个XML文件抽象为树,Element代表着树上的一个节点。总的来说,如果要操作整个文件,使用ElementTree类,如果操作节点,使用Element类。

1.2. 导入XML

这节的示例代码,将使用下面这个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>
有很多方法可以导入这个文件:
& 从硬盘中导入:
import xml.etree.ElementTree as ET
tree = ET.parse('country_data.xml')
root = tree.getroot()

&从字符串中导入:
root = ET.fromstring(country_data_as_string)
fromstring() 直接将xml从字符串中导入到Element类中,并且返回的是根节点(root element)。其他的导入方法则返回ElementTree。
root是Element的实例,所以它拥有标签和用字典储存的属性:
>>> root.tag
'data'
>>> root.attrib
{}
root也拥有可迭代的子节点:
>>> for child in root:
...   print child.tag, child.attrib
...
country {'name': 'Liechtenstein'}
country {'name': 'Singapore'}
country {'name': 'Panama'}
也可以使用索引来访问子节点:
>>> root[0][1].text
'2008'

1.3. 寻找节点

Element拥有一些方法,用来递归遍历元素。比如:
Element.iter():
>>> for neighbor in root.iter('neighbor'):
...   print neighbor.attrib
...
{'name': 'Austria', 'direction': 'E'}
{'name': 'Switzerland', 'direction': 'W'}
{'name': 'Malaysia', 'direction': 'N'}
{'name': 'Costa Rica', 'direction': 'W'}
{'name': 'Colombia', 'direction': 'E'}
Element.findall(),在当前元素的子元素中寻找拥有特定标签的所有元素。
Element.find(),和findall()类似,但只找第一个符合条件的。
示例代码中出现的Element.text用来获得元素的文本内容,Element.get()用来获得元素的属性
>>> for country in root.findall('country'):
...   rank = country.find('rank').text
...   name = country.get('name')
...   print name, rank
...
Liechtenstein 1
Singapore 4
Panama 68
学习更多高级用法,请看 XPath

1.4.修改XML文件

ElementTree提供了简单的方式用来创建XML文档,并将它保存到文件中。使用ElementTree.write()即可。
Element对象中,可直接修改他的字段(Element.text),可加入或修改属性(Element.set()),新增子元素(Element.append())
运行下面的示例代码,将给每个国家的rank加1,并且为rank元素添加‘updated’属性:
>>> for rank in root.iter('rank'):
...   new_rank = int(rank.text) + 1
...   rank.text = str(new_rank)
...   rank.set('updated', 'yes')
...
>>> tree.write('output.xml')
运行效果:
<?xml version="1.0"?>
<data>
    <country name="Liechtenstein">
        <rank updated="yes">2</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <country name="Singapore">
        <rank updated="yes">5</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
    <country name="Panama">
        <rank updated="yes">69</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighbor name="Costa Rica" direction="W"/>
        <neighbor name="Colombia" direction="E"/>
    </country>
</data>

删除节点使用Element.remove(),下面示例代码的作用是:删除所有rank大于50的国家:
>>> for country in root.findall('country'):
...   rank = int(country.find('rank').text)
...   if rank > 50:
...     root.remove(country)
...
>>> tree.write('output.xml')

运行效果:
 
<?xml version="1.0"?>
<data>
    <country name="Liechtenstein">
        <rank updated="yes">2</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <country name="Singapore">
        <rank updated="yes">5</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
</data>

1.5.1 建立XML文档

使用SubElement()方法添加子元素是很方便的:
>>> a = ET.Element('a')
>>> b = ET.SubElement(a, 'b')
>>> c = ET.SubElement(a, 'c')
>>> d = ET.SubElement(c, 'd')
>>> ET.dump(a)
<a><b /><c><d /></c></a>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值