Python如何使用ElementTree解析xml


Posted in Python onOctober 12, 2020

以country.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>

1.解析

1)调用parse()方法,返回解析树

try:
  import xml.etree.cElementTree as ET
except ImportError:
  import xml.etree.ElementTree as ET

tree = ET.parse("country.xml") # <class 'xml.etree.ElementTree.ElementTree'>
root = tree.getroot()      # 获取根节点 <Element 'data' at 0x02BF6A80>

2)调用from_string(),返回解析树的根元素

import xml.etree.ElementTree as ET
data = open("country.xml").read()
root = ET.fromstring(data) # <Element 'data' at 0x036168A0>

3)调用ElementTree类ElementTree(self, element=None, file=None) # 这里的element作为根节点

import xml.etree.ElementTree as ET
tree = ET.ElementTree(file="country.xml") # <xml.etree.ElementTree.ElementTree object at 0x03031390>
root = tree.getroot() # <Element 'data' at 0x030EA600>

1)简单遍历

import xml.etree.ElementTree as ET

tree = ET.parse("country.xml")
root = tree.getroot()
print(root.tag, ":", root.attrib) # 打印根元素的tag和属性
# 遍历xml文档的第二层
for child in root:
  # 第二层节点的标签名称和属性
  print(child.tag,":", child.attrib) 
  # 遍历xml文档的第三层
  for children in child:
    # 第三层节点的标签名称和属性
    print(children.tag, ":", children.attrib)

可以通过下标的方式直接访问节点

# 访问根节点下第一个country的第二个节点year,获取对应的文本
year = root[0][1].text # 2008

2)ElementTree提供的方法

find(match) # 查找第一个匹配的子元素, match可以时tag或是xpaht路径
findall(match) # 返回所有匹配的子元素列表
findtext(match, default=None) #
iter(tag=None) # 以当前元素为根节点 创建树迭代器,如果tag不为None,则以tag进行过滤
iterfind(match) #

例子:

# 过滤出所有neighbor标签
for neighbor in root.iter("neighbor"):
print(neighbor.tag, ":", neighbor.attrib)

# 遍历所有的counry标签
for country in root.findall("country"):
# 查找country标签下的第一个rank标签
rank = country.find("rank").text
# 获取country标签的name属性
name = country.get("name")
print(name, rank)

1) 属性相关

# 将所有的rank值加1,并添加属性updated为yes
for rank in root.iter("rank"):
  new_rank = int(rank.text) + 1
  rank.text = str(new_rank) # 必须将int转为str
  rank.set("updated", "yes") # 添加属性

# 再终端显示整个xml
ET.dump(root)
# 注意 修改的内容存在内存中 尚未保存到文件中
# 保存修改后的内容
tree.write("output.xml")
import xml.etree.ElementTree as ET

tree = ET.parse("output.xml")
root = tree.getroot()

for rank in root.iter("rank"):
  # attrib为属性字典
  # 删除对应的属性updated
  del rank.attrib['updated'] 

ET.dump(root)

小结: 关于classxml.etree.ElementTree.Element 属性相关

  • attrib

    为包含元素属性的字典

  • keys() 返回元素属性名称列表
  • items() 返回(name,value)列表
  • get(key, default=None) 获取属性
  • set(key, value) # 跟新/添加 属性
  • del xxx.attrib[key] # 删除对应的属性

2) 节点/元素 相关

删除子元素remove()

import xml.etree.ElementTree as ET

tree = ET.parse("country.xml")
root = tree.getroot()

# 删除rank大于50的国家
for country in root.iter("country"):
  rank = int(country.find("rank").text)
  if rank > 50:
    # remove()方法 删除子元素
    root.remove(country)

ET.dump(root)

添加子元素

代码:

import xml.etree.ElementTree as ET

tree = ET.parse("country.xml")
root = tree.getroot()

country = root[0]
last_ele = country[len(list(country))-1]
last_ele.tail = '\n\t\t'
# 创建新的元素, tag为test_append
elem1 = ET.Element("test_append")
elem1.text = "elem 1"
# elem.tail = '\n\t'
country.append(elem1)

# SubElement() 其实内部调用的时append()
elem2 = ET.SubElement(country, "test_subelement")
elem2.text = "elem 2"

# extend()
elem3 = ET.Element("test_extend")
elem3.text = "elem 3"
elem4 = ET.Element("test_extend")
elem4.text = "elem 4"
country.extend([elem3, elem4])

# insert()
elem5 = ET.Element("test_insert")
elem5.text = "elem 5"
country.insert(5, elem5)

ET.dump(country)

效果:

Python如何使用ElementTree解析xml

添加子元素方法总结:

  • append(subelement)
  • extend(subelements)
  • insert(index, element)

4.创建xml文档

想创建root Element,然后创建SubElement,最后将root element传入ElementTree(element),创建tree,调用tree.write()方法写入文件

对于创建元素的3个方法: 使用ET.Element、Element对象的makeelement()方法以及ET.SubElement

import xml.etree.ElementTree as ET


def subElement(root, tag, text):
  ele = ET.SubElement(root, tag)
  ele.text = text
  ele.tail = '\n'


root = ET.Element("note")

to = root.makeelement("to", {})
to.text = "peter"
to.tail = '\n'
root.append(to)

subElement(root, "from", "marry")
subElement(root, "heading", "Reminder")
subElement(root, "body", "Don't forget the meeting!")

tree = ET.ElementTree(root)
tree.write("note.xml", encoding="utf-8", xml_declaration=True)

效果:

Python如何使用ElementTree解析xml

由于原生保存的XML时默认无缩进,如果想要设置缩进的话, 需要修改保存方式

代码:

import xml.etree.ElementTree as ET
from xml.dom import minidom


def subElement(root, tag, text):
  ele = ET.SubElement(root, tag)
  ele.text = text


def saveXML(root, filename, indent="\t", newl="\n", encoding="utf-8"):
  rawText = ET.tostring(root)
  dom = minidom.parseString(rawText)
  with open(filename, 'w') as f:
    dom.writexml(f, "", indent, newl, encoding)
root = ET.Element("note")

to = root.makeelement("to", {})
to.text = "peter"
root.append(to)

subElement(root, "from", "marry")
subElement(root, "heading", "Reminder")
subElement(root, "body", "Don't forget the meeting!")

# 保存xml文件
saveXML(root, "note.xml")

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python里大整数相乘相关技巧指南
Sep 12 Python
Python中Django框架下的staticfiles使用简介
May 30 Python
Python虚拟环境virtualenv的安装与使用详解
May 28 Python
教你学会使用Python正则表达式
Sep 07 Python
Python多进程原理与用法分析
Aug 21 Python
关于Python核心框架tornado的异步协程的2种方法详解
Aug 28 Python
Python Django中间件,中间件函数,全局异常处理操作示例
Nov 08 Python
Win10里python3创建虚拟环境的步骤
Jan 31 Python
python中线程和进程有何区别
Jun 17 Python
10个顶级Python实用库推荐
Mar 04 Python
python实现简单的聊天小程序
Jul 07 Python
Python中Matplotlib的点、线形状、颜色以及绘制散点图
Apr 07 Python
Django ModelForm组件原理及用法详解
Oct 12 #Python
Python ConfigParser模块的使用示例
Oct 12 #Python
python修改微信和支付宝步数的示例代码
Oct 12 #Python
教你如何用python操作摄像头以及对视频流的处理
Oct 12 #Python
Django限制API访问频率常用方法解析
Oct 12 #Python
Python confluent kafka客户端配置kerberos认证流程详解
Oct 12 #Python
Django如何使用asyncio协程和ThreadPoolExecutor多线程
Oct 12 #Python
You might like
通过JavaScript或PHP检测Android设备的代码
2011/03/09 PHP
深入PHP数据缓存的使用说明
2013/05/10 PHP
PHP 利用Mail_MimeDecode类提取邮件信息示例
2014/01/26 PHP
php中getservbyport与getservbyname函数用法实例
2014/11/18 PHP
谈谈你对Zend SAPIs(Zend SAPI Internals)的理解
2015/11/10 PHP
js实现ASP分页函数 HTML分页函数
2006/09/22 Javascript
jQuery插件开发基础简单介绍
2013/01/07 Javascript
javascript实现文字图片上下滚动的具体实例
2013/06/28 Javascript
jQuery 回调函数(callback)的使用和基础
2015/02/26 Javascript
jQuery实现购物车数字加减效果
2015/03/14 Javascript
JavaScript正则表达式之multiline属性的应用
2015/06/16 Javascript
Bootstrap popover用法详解
2016/12/22 Javascript
jQuery实现的下雪动画效果示例【附源码下载】
2018/02/02 jQuery
react在安卓中输入框被手机键盘遮挡问题的解决方法
2018/09/03 Javascript
详解vue 项目白屏解决方案
2018/10/31 Javascript
JavaScript使用小插件实现倒计时的方法讲解
2019/03/11 Javascript
ionic+html5+API实现双击返回键退出应用
2019/09/17 Javascript
vue中的.$mount('#app')手动挂载操作
2020/09/02 Javascript
[04:16]DOTA2全国高校联赛16强抽签
2018/05/02 DOTA
python实现的简单抽奖系统实例
2015/05/22 Python
详解Python安装scrapy的正确姿势
2018/06/26 Python
python抢购软件/插件/脚本附完整源码
2021/03/04 Python
CSS伪类与CSS伪元素的区别及由来具体说明
2012/12/07 HTML / CSS
可以随进度显示不同颜色的css3进度条分享
2014/04/11 HTML / CSS
html5-Canvas可以在web中绘制各种图形
2012/12/26 HTML / CSS
Html5+JS实现手机摇一摇功能
2015/04/24 HTML / CSS
家用个人磨皮机:Trophy Skin
2017/03/30 全球购物
WWE美国职业摔角官方商店:WWE Shop
2018/11/15 全球购物
Java程序员综合测试题
2014/04/25 面试题
幼师专业毕业生自荐信
2013/09/29 职场文书
我的求职计划书
2014/01/10 职场文书
对标管理实施方案
2014/03/12 职场文书
出租房屋协议书
2014/09/14 职场文书
2015年乡镇卫生院妇幼保健工作总结
2015/05/19 职场文书
三下乡活动心得体会
2016/01/23 职场文书
大学生村官工作心得体会
2016/01/23 职场文书