可以查看官方文档,里面给的内容给得挺详尽,下面是我自己总结的一些常用的封装函数

Element.findall(‘tag’):仅查找具有标记的元素,这些元素是当前元素的直接子元素。
Element.find('tag'): 找到具有特定标记的第一个子项
Element.text: 获取元素的内容
Element.get(): 获取元素的属性修改元素属性以及内容的操作:
以例子来说明:
for rank in root.iter('rank'):        //通过迭代找出根元素的子元素中标签为rank的元素
...     new_rank = int(rank.text) + 1//修改rank的内容,使其加1
...     rank.text = str(new_rank)     //注意内容类型的转换,加减用int,存储用string
...     rank.set('updated', 'yes')    //给rank添加属性:uodated=yesElement.remove():删除某个节点元素
以例子来说明:
for country in root.findall('country'):      //遍历所有标签为country的节点
...     rank = int(country.find('rank').text)//获得country的子节点rank的内容
...     if rank > 50:                        //内容大于50
...         root.remove(country)             //将包含该rank节点的country节点删除
...

以下例子来自于别人博客的例子,代码很详细,包括了从读入xml文件到节点的增删查改操作几乎齐全,有一个缺点:此处的读取xml文件考虑的是最简单的文件较小,且在本地直接读取;有一些工程需要在客户端和服务端交互xml文件时,此时如果将整个xml文件接收完全再来进行操作容易导致堵塞。所以在官方文档里提到用treebuilder和另一种方法来解决。

使用ElementTree,先将文件读入,解析成树,之后,根据路径,可以定位到树的每个节点,再对节点进行修改,最后直接将其输出.

#!/usr/bin/python
# -*- coding=utf-8 -*-
# author : wklken@yeah.net
# date: 2012-05-25
# version: 0.1from xml.etree.ElementTree import ElementTree,Elementdef read_xml(in_path):  '''读取并解析xml文件 in_path: xml路径 return: ElementTree'''  tree = ElementTree()  tree.parse(in_path)  return treedef write_xml(tree, out_path):  '''将xml文件写出 tree: xml树 out_path: 写出路径'''  tree.write(out_path, encoding="utf-8",xml_declaration=True)def if_match(node, kv_map):  '''判断某个节点是否包含所有传入参数属性 node: 节点 kv_map: 属性及属性值组成的map'''  for key in kv_map:  if node.get(key) != kv_map.get(key):  return False  return True#---------------search -----def find_nodes(tree, path):  '''查找某个路径匹配的所有节点 tree: xml树 path: 节点路径'''  return tree.findall(path)def get_node_by_keyvalue(nodelist, kv_map):  '''根据属性及属性值定位符合的节点,返回节点 nodelist: 节点列表 kv_map: 匹配属性及属性值map'''  result_nodes = []  for node in nodelist:  if if_match(node, kv_map):  result_nodes.append(node)  return result_nodes#---------------change -----def change_node_properties(nodelist, kv_map, is_delete=False):  '''修改/增加 /删除 节点的属性及属性值 nodelist: 节点列表 kv_map:属性及属性值map'''  for node in nodelist:  for key in kv_map:  if is_delete:   if key in node.attrib:  del node.attrib[key]  else:  node.set(key, kv_map.get(key))def change_node_text(nodelist, text, is_add=False, is_delete=False):  '''改变/增加/删除一个节点的文本 nodelist:节点列表 text : 更新后的文本'''  for node in nodelist:  if is_add:  node.text += text  elif is_delete:  node.text = ""  else:  node.text = textdef create_node(tag, property_map, content):  '''新造一个节点 tag:节点标签 property_map:属性及属性值map content: 节点闭合标签里的文本内容 return 新节点'''  element = Element(tag, property_map)  element.text = content  return elementdef add_child_node(nodelist, element):  '''给一个节点添加子节点 nodelist: 节点列表 element: 子节点'''  for node in nodelist:  node.append(element)def del_node_by_tagkeyvalue(nodelist, tag, kv_map):  '''同过属性及属性值定位一个节点,并删除之 nodelist: 父节点列表 tag:子节点标签 kv_map: 属性及属性值列表'''  for parent_node in nodelist:  children = parent_node.getchildren()  for child in children:  if child.tag == tag and if_match(child, kv_map):  parent_node.remove(child)if __name__ == "__main__":#1. 读取xml文件  tree = read_xml("./test.xml")#2. 属性修改  #A. 找到父节点  nodes = find_nodes(tree, "processers/processer")#B. 通过属性准确定位子节点  result_nodes = get_node_by_keyvalue(nodes, {"name":"BProcesser"})#C. 修改节点属性  change_node_properties(result_nodes, {"age": "1"})#D. 删除节点属性  change_node_properties(result_nodes, {"value":""}, True)#3. 节点修改  #A.新建节点  a = create_node("person", {"age":"15","money":"200000"}, "this is the firest content")#B.插入到父节点之下  add_child_node(result_nodes, a)#4. 删除节点  #定位父节点  del_parent_nodes = find_nodes(tree, "processers/services/service")#准确定位子节点并删除之  target_del_node = del_node_by_tagkeyvalue(del_parent_nodes, "chain", {"sequency" : "chain1"})#5. 修改节点文本  #定位节点  text_nodes = get_node_by_keyvalue(find_nodes(tree, "processers/services/service/chain"), {"sequency":"chain3"})  change_node_text(text_nodes, "new text")#6. 输出到结果文件  write_xml(tree, "./out.xml")

操作对象(原始xml文件):

<?xml version="1.0" encoding="UTF-8"?>
<framework>  <processers>  <processer name="AProcesser" file="lib64/A.so"  path="/tmp">  </processer>  <processer name="BProcesser" file="lib64/B.so" value="fordelete">  </processer>  <processer name="BProcesser" file="lib64/B.so2222222"/><services>  <service name="search" prefix="/bin/search?"  output_formatter="OutPutFormatter:service_inc"><chain sequency="chain1"/>  <chain sequency="chain2"></chain>  </service>  <service name="update" prefix="/bin/update?">  <chain sequency="chain3" value="fordelete"/>  </service>  </services>  </processers>
</framework>

执行程序之后,得到的结果文件:

<?xml version='1.0' encoding='utf-8'?>
<framework>  <processers>  <processer file="lib64/A.so" name="AProcesser" path="/tmp">  </processer>  <processer age="1" file="lib64/B.so" name="BProcesser">  <person age="15" money="200000">this is the firest content</person>  </processer>  <processer age="1" file="lib64/B.so2222222" name="BProcesser">  <person age="15" money="200000">this is the firest content</person>  </processer><services>  <service name="search" output_formatter="OutPutFormatter:service_inc"  prefix="/bin/search?"><chain sequency="chain2" />  </service>  <service name="update" prefix="/bin/update?">  <chain sequency="chain3" value="fordelete">new text</chain>  </service>  </services>  </processers>
</framework>

elementTree解析并修改xml文件实例相关推荐

  1. libxml2生成,解析,修改xml文件,以及使用实例

    利用libxml2生成,解析,修改xml文件. 1. 生成xml文件 // createXmlFile.cpp#include <stdio.h> #include <libxml/ ...

  2. python处理xml文件_Python解析并修改XML文件

    XML 本质上只是一种数据格式,它的本意并不是管理数据,因此,在 XML 应用中,数据的管理仍然要借助数据库,尤其是当数据量很大.性能要求很高的时候. XML数据库具有以下优势: XML数据库能够对半 ...

  3. 了解女友的心还不如了解Python之在Python中解析和修改XML

    2021年12月15日 10:14 ·  阅读 30 摘要: 工作中我们时常需要解析用不同语言编写的数据.Python 提供了许多库来解析或拆分用其他语言编写的数据.在这篇 Python XML 解析 ...

  4. 面试官问我:如何在 Python 中解析和修改 XML

    摘要:我们经常需要解析用不同语言编写的数据.Python提供了许多库来解析或拆分用其他语言编写的数据.在此 Python XML 解析器教程中,您将学习如何使用 Python 解析 XML. 本文分享 ...

  5. Java 操纵XML之修改XML文件

    Java 操纵XML之修改XML文件 一.JAVA DOM PARSER DOM interfaces The DOM defines several Java interfaces. Here ar ...

  6. python修改xml标签的值_对python修改xml文件的节点值方法详解

    这是我的xml文件结构 <?xml version='1.0' encoding='utf-8'?> JPEGImages train_2018-05-08_1000.jpg D:\all ...

  7. java读取并修改xml文件

    java读取并修改xml文件 java如何读取xml并且修改xml文件呢?代码如下: //复制模板xnl File file = new File(xmlSavePath + "/mb.xm ...

  8. 精通LINQ--11.4.3 修改XML文件中的元素

    原文地址:https://blog.csdn.net/linqmail/article/details/2341575 使用LINQ to XML还可以修改XML文件中的元素.下面的实例代码使用LIN ...

  9. Golang——解析GBK编码XML文件

    Golang--解析GBK编码XML文件 对于golang的xml解析,大家应该很熟悉了,或者说golang的xml解析其实很简单.语言本身支持xml解析,通过实例即可快速理解.但是在实际开发中总会遇 ...

最新文章

  1. 从命令行运行postman脚本
  2. Navicat日期时间格式
  3. IBM、甲骨文、CNCF 就谷歌对 Istio 治理的处理提出抗议
  4. 3d数学基础图形与游戏开发 英文版_1850款文字标题字幕条,AE图形预设包,logo生成神器...
  5. python数据结构与算法
  6. [css] 请写出font属性的快捷写法
  7. WEB安全基础-文件下载漏洞以及文件包含漏洞演示
  8. 3D应用开发中的欧拉角和旋转矩阵
  9. 拓端tecdat|R语言中回归模型预测的不同类型置信区间应用比较分析
  10. 树莓派HDMI分辨率的设置
  11. 渗透学习-SQL注入篇-基础知识的学习(持续更新中)
  12. 2015级移动本面向对象课程主页
  13. 区块链传奇人物-爆炸头SBF
  14. 毕业论文知识点记录(四)——MaxEnt模型
  15. 西门子1200 plc与台达14ES plc之间modbus 通讯实战程序 西门子1200plc做主站,台达DVP plc做从站,进行数据交换
  16. 关于互联网“毕业“的一些思考
  17. 为了沙漠中的奋进者:“视人为人”的陕煤曹家滩 智慧矿区
  18. 2021.12.10 vue 路由 (13)
  19. 数据流图 系统流程图 程序流程图 程序的系统结构图之间的区别和联系
  20. “+智能”与混合云成为战略主线 郑叶来如何解码华为云2018年终总结...

热门文章

  1. 机器学习基础-引用同济子豪兄版
  2. 怎么用ps存Ae的html,怎么把ps文件导入到ae
  3. 简单的开放redis6379端口
  4. conda 安装 jupyter lab
  5. Netty-心跳检测的作用和实现方法
  6. 到底什么是机器学习模型?这篇文章终于讲明白了
  7. “21天好习惯“ 第六期 — 6
  8. Linux几个版本下创建桌面快捷方式、开始菜单快捷方式、文件管理器右键菜单(只deepin uos 20)
  9. Apipost和 Apifox 哪个好用?两大国产API管理工具深度对比
  10. 【c语言】职工信息管理系统 包含读取写入txt文件,职工信息的增删改查