警告:
XML模块对于错误或恶意构造的数据是不安全的。如果需要解析不受信任或未经身份验证的数据,需要注意XML漏洞
xml.etree.ElementTree: ElementTree API, 一个简单而轻量级的xml处理器。
1、该Element类型是一个灵活的容器对象,旨在将分层数据结构存储在内存中。该类型可以描述为列表和字典之间的交叉。
2、每个元素都有许多与之关联的属性:
标签、属性(存储在字典中)、文本字符串、许多子元素(存储在Python序列中)
3、创建元素实例,请使用Element构造函数 和 SubElement()工厂函数。
XML树和元素
XML是一种固有的分层数据格式,表示它的最自然的方式是使用树。
ElementTree:将整个XML文档表示为树;
Element:表示此树中的单个节点。
与整个文档的交互(读取和写入文件)通常在ElementTree关卡上完成。
与单个XML元素及其子元素的交互在该Element级别上完成。
从磁盘读取xml文件
举例 test.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
strXMLPath = 'test.xml'
tree = ET.parse(strXMLPath) # xml.etree.ElementTree.ElementTree object
root = tree.getroot() # Element 'data'
print root.tag, root.attrib # 输出:data {}
其中子节点,可以迭代而来:
for child in root:
print child.tag, child.attrib
输出:
country {'name': 'Liechtenstein'}
country {'name': 'Singapore'}
country {'name': 'Panama'}
子项是嵌套的,我们可以通过索引访问特定的子节点:
root[0][1].text
输出: '2008'
查找元素
1、Element有一些有用的方法可以帮助递归迭代它下面的所有子树(它的子节点,它们的子节点等)。例如, Element.iter():
for neighbor in root.iter('neighbor'):
print neighbor.attrib
输出:
{'direction': 'E', 'name': 'Austria'}
{'direction': 'W', 'name': 'Switzerland'}
{'direction': 'N', 'name': 'Malaysia'}
{'direction': 'W', 'name': 'Costa Rica'}
{'direction': 'E', 'name': 'Colombia'}
2、Element.findall()仅查找具有标记的元素,这些元素是当前元素的直接子元素。
Element.find()查找具有特定标记的第一个子项,并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
修改XML
ElementTree提供了一种构建XML文档并将其写入文件的简单方法:ElementTree.write()。
- Element.text
- 直接更改其字段 Element.set(key, value)方法
- 添加和修改属性 Element.append()方法
- 增加新的子项 Element.remove(Element_del)
- 删除元素
例1:为每个国家/地区的排名+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')
例2:删除排名高于50的所有国家/地区:
for country in root.findall('country'):
rank = int(country.find('rank').text)
if rank > 50:
root.remove(country)
tree.write('output.xml')
构建xml文档
SubElement()函数:为给定元素创建新子元素
a = ET.Element('a')
b = ET.SubElement(a, 'b')
c = ET.SubElement(a, 'c')
d = ET.SubElement(c, 'd')
tree = ET.ElementTree(a)
tree.write('output.xml', encoding='utf-8')
输出:
<a>
<b/>
<c>
<d/>
</c>
</a>