天天看点

python解析xml---xml.etree.ElementTree

警告:

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')
           
python解析xml---xml.etree.ElementTree

例2:删除排名高于50的所有国家/地区:

for country in root.findall('country'):
    rank = int(country.find('rank').text)
    if rank > 50:
        root.remove(country)

tree.write('output.xml')
           
python解析xml---xml.etree.ElementTree

构建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>