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中的标识运算符
May 14 Python
Python实现队列的方法
May 26 Python
简单的Apache+FastCGI+Django配置指南
Jul 22 Python
PySide和PyQt加载ui文件的两种方法
Feb 27 Python
树莓派实现移动拍照
Jun 22 Python
Django框架orM与自定义SQL语句混合事务控制操作
Jun 27 Python
基于Python安装pyecharts所遇的问题及解决方法
Aug 12 Python
python 正则表达式参数替换实例详解
Jan 17 Python
django处理select下拉表单实例(从model到前端到post到form)
Mar 13 Python
pyspark 随机森林的实现
Apr 24 Python
python实现学生成绩测评系统
Jun 22 Python
python中random.randint和random.randrange的区别详解
Sep 20 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
PHP安全下载文件的方法
2016/04/07 PHP
详解使用php调用微信接口上传永久素材
2017/04/11 PHP
PHP单例模式模拟Java Bean实现方法示例
2018/12/07 PHP
说说掌握JavaScript语言的思想前提想学习js的朋友可以看看
2009/04/01 Javascript
IE FF OPERA都可用的弹出层实现代码
2009/09/29 Javascript
js字符编码函数区别分析
2011/12/28 Javascript
Javascript自定义排序 node运行 实例
2013/06/05 Javascript
你所不了解的javascript操作DOM的细节知识点(一)
2015/06/17 Javascript
JavaScript创建闭包的两种方式的优劣与区别分析
2015/06/22 Javascript
jquery.cookie实现的客户端购物车操作实例
2015/12/24 Javascript
微信小程序 Flex布局详解
2016/10/09 Javascript
Bootstrap CDN和本地化环境搭建
2016/10/26 Javascript
jQuery基于xml格式数据实现模糊查询及分页功能的方法
2016/12/25 Javascript
jquery 实现复选框的全选操作实例代码
2017/01/24 Javascript
详解node.js搭建代理服务器请求数据
2017/04/08 Javascript
利用yarn代替npm管理前端项目模块依赖的方法详解
2017/09/04 Javascript
微信小程序实现点击按钮修改文字大小功能【附demo源码下载】
2017/12/06 Javascript
vue 1.0 结合animate.css定义动画效果
2018/07/11 Javascript
详解js的视频和音频采集
2018/08/09 Javascript
微信小程序顶部导航栏滑动tab效果
2019/01/28 Javascript
vue ssr+koa2构建服务端渲染的示例代码
2020/03/23 Javascript
python如何实现远程控制电脑(结合微信)
2015/12/21 Python
python装饰器简介---这一篇也许就够了(推荐)
2019/04/01 Python
Python3 字典dictionary入门基础附实例
2020/02/10 Python
谈谈python垃圾回收机制
2020/09/27 Python
Python操作PostgreSql数据库的方法(基本的增删改查)
2020/12/29 Python
美国在线眼镜店:GlassesShop
2018/11/15 全球购物
公司人力资源的自我评价
2014/01/02 职场文书
初中英语课后反思
2014/04/25 职场文书
乡镇消防安全责任书
2014/07/23 职场文书
项目投资合作意向书
2014/07/29 职场文书
大学生作弊检讨书
2014/09/11 职场文书
张丽莉观后感
2015/06/16 职场文书
培根随笔读书笔记
2015/07/01 职场文书
2015年支教教师工作总结
2015/07/22 职场文书
篮球拉拉队口号
2015/12/25 职场文书