当前位置: 首页 > news >正文

解析 xml 文件 - xml.etree ElementTree

目录


假设有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><neighbor name="xxxx" direction="W"/>
</data>

1、导入模块 →\rightarrow 读取文件 →\rightarrow 获取根节点 →\rightarrow 获取根节点的标签与属性

import xml.etree.ElementTree as ET# 读取文件
tree = ET.parse('test.xml', parser=None)# 获取根
root = tree.getroot()
print(root)   # <Element 'data' at 0x10c8b2b30># 根的标签与属性
print(root.tag)   # data
print(root.attrib)   # {}

另一种方式是 通过 openread() 将文件内容读取为字符串 str 格式。
再通过 ET.fromstring() 函数获取root 节点。获取 root 节点之后的操作就都一样了。

import xml.etree.ElementTree as ETwith open('text.xml') as f:data_str = f.read()root = ET.fromstring(data_str)
print(root.tag)   # data
print(root.attrib)   # {}

2、遍历一级子节点、获取子节点的标签 与 属性

for child in root:print(child.tag, child.attrib)
# country {'name': 'Liechtenstein'}
# country {'name': 'Singapore'}
# country {'name': 'Panama'}

3、通过索引 获取数据

  • rootrootroot是根节点
  • root[0]root[0]root[0] 是下一级子节点的第1个元素
  • root[0][1]root[0] [1]root[0][1]是下二级子节点的第2个元素
print(root[0][1].tag)   # year
print(root[0][1].attrib)   # {}
print(root[0][1].text)   # 2008

4、Element.findall()、Element.find() - 按照 tag 值查找 子节点

Element.findall()Element.find()

'''
Element.findall('xxx') :查找当前节点(Element)下,tag为'xxx' 的所有子节点,放到一个list中
Element.find('xxx'):查找当前节点(Element)下,tag为'xxx' 的第一个子节点
Element.get(key) : (节点属性是一个字典)获取节点属性 对应的 value 
'''
for country in root.findall('country'):rank = country.find('rank').text   #name = country.get('name') print(name, rank)
# Liechtenstein 1
# Singapore 4
# Panama 68

5、Element.iter() - 循环迭代方式 查找指定 tag 的节点

这里 循环迭代方式 指的是,在该节点下的 所有阶 的子节点中查找。不像 find 和 findall,find 和 findall 只在 一级子节点中查找。

# 生成一个迭代器
print(root.iter('neighbor'))   # <_elementtree._element_iterator object at 0x101a6d630># root 节点下,循环迭代的方式查找 tag 为 'neighbor' 的 子节点
for neighbor in root.iter('neighbor'):print(neighbor.attrib)
# {'name': 'Austria', 'direction': 'E'}
# {'name': 'Switzerland', 'direction': 'W'}
# {'name': 'Malaysia', 'direction': 'N'}
# {'name': 'Costa Rica', 'direction': 'W'}
# {'name': 'Colombia', 'direction': 'E'}
# {'name': 'xxxx', 'direction': 'W'}
http://www.lryc.cn/news/17855.html

相关文章:

  • LeetCode Cookbook 哈希表(collections.Counter()和collections.defaultdict())
  • spring boot项目中i18n和META-INF.spring下的文件的作用
  • 3年自动化测试经验,面试连20K都拿不到,现在都这么卷了吗····
  • Python数据结构与算法篇(四)-- 链表的实现
  • 【java基础】循环语句、中断控制语句
  • 万字长文带你实战 Elasticsearch 搜索
  • Web网页测试全流程解析论Web自动化测试
  • 初识Python——“Python”
  • LocalDateTime使用
  • 设计模式学习笔记 - 外观模式
  • 如何写出一份优秀的简历和求职信?
  • OpenGL超级宝典学习笔记:原子计数器
  • 深圳/东莞/惠州师资比较强的CPDA数据分析认证
  • LeetCodeHOT100热题02
  • 虹科Dimetix激光测距仪在锯切系统中的应用
  • FreeRTOS入门(02):任务基础使用与说明
  • ESP通过乐为物联控制灯,微信发送数值,ESP上传传感器数据
  • Linux:共享内存api使用
  • android9.0 java静态库操作JNI实例 动态注册
  • 自定义复杂图片水印
  • 文章读后感——《人间清醒,内容为王》
  • 51单片机入门 - 驱动多位数码管
  • Java进击框架:Spring(一)
  • Java笔记(18)
  • 【免费教程】地下水环境监测技术规范HJ/T164-2020解读使用教程
  • Html 代码学习
  • 如何通过IP找到地址?
  • 业务单据堆积如山?如何提升会计做账效率?
  • 华为OD机试题,用 Java 解【VLAN 资源池】问题
  • 面试加分项:JVM 锁优化和逃逸分析详解