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 optparse模块使用实例
Apr 09 Python
Python中的条件判断语句基础学习教程
Feb 07 Python
Python中shutil模块的常用文件操作函数用法示例
Jul 05 Python
浅谈python中的正则表达式(re模块)
Oct 17 Python
pandas去重复行并分类汇总的实现方法
Jan 29 Python
如何更改 pandas dataframe 中两列的位置
Dec 27 Python
python应用Axes3D绘图(批量梯度下降算法)
Mar 25 Python
python支持多继承吗
Jun 19 Python
TensorFlow的环境配置与安装教程详解(win10+GeForce GTX1060+CUDA 9.0+cuDNN7.3+tensorflow-gpu 1.12.0+python3.5.5)
Jun 22 Python
python Autopep8实现按PEP8风格自动排版Python代码
Mar 02 Python
pandas DataFrame.shift()函数的具体使用
May 24 Python
Django分页器的用法你都了解吗
May 26 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
一个可查询所有表的“通用”查询分页类
2006/10/09 PHP
解析php获取字符串的编码格式的方法(函数)
2013/06/21 PHP
深入讲解PHP Session及如何保持其不过期的方法
2015/08/18 PHP
PHP利用imagick生成组合缩略图
2016/02/19 PHP
利用php做服务器和web前端的界面进行交互
2016/10/31 PHP
PHP中非常有用却鲜有人知的函数集锦
2019/08/17 PHP
JS JavaScript获取Url参数,src属性参数
2021/03/09 Javascript
基于jQuery实现左右div自适应高度完全相同的代码
2012/08/09 Javascript
jQuery+php实时获取及响应文本框输入内容的方法
2016/05/24 Javascript
JS中对数组元素进行增删改移的方法总结
2016/12/15 Javascript
如何清除IE10+ input X 文本框的叉叉和密码输入框的眼睛图标
2016/12/21 Javascript
jquery仿苹果的时间/日期选择效果
2017/03/08 Javascript
nodejs开发——express路由与中间件
2017/03/24 NodeJs
JS实现table表格固定表头且表头随横向滚动而滚动
2017/10/26 Javascript
Vue.js实现表格渲染的方法
2018/09/07 Javascript
Vue3.0数据响应式原理详解
2019/10/09 Javascript
jsonp格式前端发送和后台接受写法的代码详解
2019/11/07 Javascript
webpack proxy 使用(代理的使用)
2020/01/10 Javascript
Vue强制组件重新渲染的方法讨论
2020/02/03 Javascript
Vue+Bootstrap收藏(点赞)功能逻辑与具体实现
2020/10/22 Javascript
详解python时间模块中的datetime模块
2016/01/13 Python
Python探索之爬取电商售卖信息代码示例
2017/10/27 Python
Python 从subprocess运行的子进程中实时获取输出的例子
2019/08/14 Python
python Zmail模块简介与使用示例
2020/12/19 Python
css3实现超炫风车特效
2014/11/12 HTML / CSS
CSS3中的Media Queries学习笔记
2016/05/23 HTML / CSS
html5 制作地图当前定位箭头的方法示例
2020/01/10 HTML / CSS
Html5页面获取微信公众号的openid的方法
2020/05/12 HTML / CSS
GOOD AMERICAN官网:为曲线性感而设计
2017/12/28 全球购物
GANT英国官方网上商店:甘特衬衫
2018/02/06 全球购物
新员工欢迎词
2014/01/12 职场文书
大学生演讲稿
2014/04/25 职场文书
无毒社区工作方案
2014/05/23 职场文书
预备党员对照检查材料思想汇报
2014/09/24 职场文书
颐和园的导游词
2015/01/30 职场文书
员工升职自荐信
2015/03/27 职场文书