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

来源:互联网 发布:湘南学院网络教学平台 编辑:程序博客网 时间:2024/06/05 05:51

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 ETtree = 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 1Singapore 4Panama 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>










0 0
原创粉丝点击