python xml.etree.ElementTree模块

使用的XML文件如下:file.xml

<?xml version="1.0"?>
<data name="ming">
    <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>

导入模块

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/11/30 0030 18:18
# @Author  : ming
import xml.etree.ElementTree as ET

读取文件

result = ET.parse("file.xml")  # 打开文件
root = result.getroot()  # 获取根节点

打印一下根节点信息

print(root.tag, root.attrib)  # 根节点标签和属性值
#运行结果:data {'name': 'ming'}

打印一下根节点的孩子节点

for i in root:  # 循环根节点的孩子节点
    print(i.tag, i.attrib)  # 打印孩子节点的标签和属性值
    print(i[0].tag, i[0].text)  # 打印孙子节点中第一个节点的标签和属性值。多层节点都可以通过下标访问
# 运行结果:
# country {'name': 'Singapore'}
# rank 4
# country {'name': 'Panama'}
# rank 68

findall 直接定位节点

for k in root.findall('country'):  # 直接定位该节点
    print(k.tag, k.attrib)  # 打印孩子节点的标签和属性值
    print(k[1].tag, k[1].text)  # 打印孙子节点中第一个节点的标签和属性值。多层节点都可以通过下标访问
#运行结果
# country {'name': 'Singapore'}
# year 2011
# country {'name': 'Panama'}
# year 2011

 iter 遍历所有节点

for m in root.iter():  # 遍历所有节点
    print(m.tag, m.attrib, m.text)  # 打印所有节点的标签、属性、值
data {'name': 'ming'} 
    
country {'name': 'Singapore'} 
        
rank {} 4
year {} 2011
gdppc {} 59900
neighbor {'name': 'Malaysia', 'direction': 'N'} None
country {'name': 'Panama'} 
        
rank {} 68
year {} 2011
gdppc {} 13600
neighbor {'name': 'Costa Rica', 'direction': 'W'} None
neighbor {'name': 'Colombia', 'direction': 'E'} None
运行结果

iter 遍历特定的节点,不遍历子节点

for p in root.iter("country"):  # 遍历所有country节点自身,不遍历子节点
    print(p.tag, p.attrib)  # 打印所有country节点的标签、属性
#运行结果
# country {'name': 'Singapore'}
# country {'name': 'Panama'}

find 查找第一个匹配的节点

firstCountry = root.find("country")  # 返回第一个tag为country的element,如没有,返回None
print(firstCountry.attrib)  # 第一个country节点的属性值
# 运行结果
# {'name': 'Singapore'}

append 增加一个新的节点

newEle = ET.Element("Newtag")  # 新节点的标签
newEle.attrib = {"name": "NewElement", "age": "20"}  # 新节点的属性
newEle.text = "This is a new element"  # 新节点的值
# a = root.find("country")  # 第一个country节点
# a.append(newEle)  # 在第一个country中添加
#
# root[0].append(newEle)  # 根节点中第一个子节点下添加
root.append(newEle)  # 把这个新节点放在哪个节点下,这里的root代表根节点
result.write("file.xml")  # 写回原文件
<data name="ming">
    <country name="Singapore">
        <rank>4</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor direction="N" name="Malaysia"/>
    </country>
    <country name="Panama">
        <rank>68</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighbor direction="W" name="Costa Rica"/>
        <neighbor direction="E" name="Colombia"/>
    </country>
    <Newtag age="20" name="NewElement">This is a new element</Newtag>
</data>
运行结果

修改节点信息

# 修改节点属性
sub1 = root.find("country")
sub1.set("name", "Chinese") # 修改name=chinese
result.write("file.xml")  # 写回原文件

# 修改节点值
sub2 = root.find("country")
sub2.find("year").text = "2018" #修改year的值为2018
result.write("file.xml")  # 写回原文件
<data name="ming">
    <country name="Chinese">
        <rank>4</rank>
        <year>2018</year>
        <gdppc>59900</gdppc>
        <neighbor direction="N" name="Malaysia" />
    </country>
    <country name="Panama">
        <rank>68</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighbor direction="W" name="Costa Rica" />
        <neighbor direction="E" name="Colombia" />
    </country>
</data>
View Code

删除节点

sub3 = root.find("country")
root.remove(sub3)
result.write("file.xml")  # 写回原文件
<data name="ming">
    <country name="Panama">
        <rank>68</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighbor direction="W" name="Costa Rica"/>
        <neighbor direction="E" name="Colombia"/>
    </country>
</data>
运行结果

 创建新的XML文件

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/12/2 0002 14:44
# @Author  : ming

import xml.etree.ElementTree as ET

# 创建一个新的XML文件,根节点为yangyongming
new_xml = ET.Element("yangyongming")

# 孩子节点为name,指点父亲节点为new_xml sttrib属性
new_1 = ET.SubElement(new_xml, "name", attrib={"name": "hello"})

# 孙子节点sex 父亲节点new_1
new_s1 = ET.SubElement(new_1, "sex")
# 孙子节点sex 赋值"man"
new_s1.text = "man"
# 孙子节点 age, 父亲节点new_1
new_s2 = ET.SubElement(new_1, "age")
# 孙子节点age 赋值“18”
new_s2.text = "18"

# 转换为XML文件,写入文件
et = ET.ElementTree(new_xml)
et.write("file.xml", encoding="utf-8")
<yangyongming>
    <name name="hello">
        <sex>man</sex>
        <age>18</age>
    </name>
</yangyongming>
运行结果
原文地址:https://www.cnblogs.com/ming5218/p/7943602.html