Python实现的读取/更改/写入xml文件操作示例


Posted in Python onAugust 30, 2018

本文实例讲述了Python实现的读取/更改/写入xml文件操作。分享给大家供大家参考,具体如下:

原始文档内容(test.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>

Python操作xml代码:

# -*- coding:utf-8 -*-
'''
Created on 2018年8月30日
@author: Administrator
'''
from xml.etree.ElementTree import ElementTree,Element
def read_xml(in_path):
  '''''读取并解析xml文件
    in_path: xml路径
    return: ElementTree'''
  tree = ElementTree()
  tree.parse(in_path)
  return tree
def 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 = text
def create_node(tag, property_map, content):
  '''''新造一个节点
    tag:节点标签
    property_map:属性及属性值map
    content: 节点闭合标签里的文本内容
    return 新节点'''
  element = Element(tag, property_map)
  element.text = content
  return element
def 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("D://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, "D://xiugai.xml")

更改之后的内容(xiugai.xml):

<?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>
Python 相关文章推荐
Python 列表排序方法reverse、sort、sorted详解
Jan 22 Python
浅谈python字符串方法的简单使用
Jul 18 Python
python常见排序算法基础教程
Apr 13 Python
python基本语法练习实例
Sep 19 Python
利用python实现微信头像加红色数字功能
Mar 26 Python
Python字符串的全排列算法实例详解
Jan 07 Python
python 批量添加的button 使用同一点击事件的方法
Jul 17 Python
python中matplotlib条件背景颜色的实现
Sep 02 Python
使用TFRecord存取多个数据案例
Feb 17 Python
利用python绘制中国地图(含省界、河流等)
Sep 21 Python
详解pandas apply 并行处理的几种方法
Feb 24 Python
pytorch 使用半精度模型部署的操作
May 24 Python
python实现录音小程序
Oct 26 #Python
Python图像处理之简单画板实现方法示例
Aug 30 #Python
浅析python中numpy包中的argsort函数的使用
Aug 30 #Python
浅析python3中的os.path.dirname(__file__)的使用
Aug 30 #Python
python语音识别实践之百度语音API
Aug 30 #Python
python调用百度语音识别实现大音频文件语音识别功能
Aug 30 #Python
python的中异常处理机制
Aug 30 #Python
You might like
颠覆常识!无色透明的咖啡诞生了(中日双语)
2021/03/03 咖啡文化
TP - 比RBAC更好的权限认证方式(Auth类认证)
2021/03/09 PHP
为jQuery增加join方法的实现代码
2010/11/28 Javascript
鼠标滑上去后图片放大浮出效果的js代码
2011/05/28 Javascript
简单几行JS Code实现IE邮件转发新浪微博
2013/07/03 Javascript
基于jQuery实现网页进度显示插件
2015/03/04 Javascript
jQuery绑定事件-多种实现方式总结
2016/05/09 Javascript
使用vue构建一个上传图片表单
2017/07/04 Javascript
vue父组件向子组件传递多个数据的实例
2018/03/01 Javascript
Angularjs Promise实例详解
2018/03/15 Javascript
使用VUE+iView+.Net Core上传图片的方法示例
2019/01/04 Javascript
JS实现指定区域的全屏显示功能示例
2019/04/25 Javascript
通过GASP让vue实现动态效果实例代码详解
2019/11/24 Javascript
Python发送form-data请求及拼接form-data内容的方法
2016/03/05 Python
Python 爬虫学习笔记之多线程爬虫
2016/09/21 Python
Python处理PDF及生成多层PDF实例代码
2017/04/24 Python
用 Python 爬了爬自己的微信朋友(实例讲解)
2017/08/25 Python
实例讲解Python脚本成为Windows中运行的exe文件
2019/01/24 Python
使用python写的opencv实时监测和解析二维码和条形码
2019/08/14 Python
Python selenium的基本使用方法分析
2019/12/21 Python
基于python求两个列表的并集.交集.差集
2020/02/10 Python
Python利用socket模块开发简单的端口扫描工具的实现
2021/01/27 Python
Pam & Gela官网:美国性感前卫女装品牌
2018/07/19 全球购物
Rossignol金鸡美国官网:始于1907年法国百年雪具品牌
2019/03/06 全球购物
EJB2和EJB3在架构上的不同点
2014/09/29 面试题
自荐信格式
2013/12/01 职场文书
《大禹治水》教学反思
2014/04/27 职场文书
省级青年文明号申报材料
2014/05/23 职场文书
局领导领导班子四风对照检查材料
2014/09/27 职场文书
交通事故赔偿协议书
2014/10/16 职场文书
慈善募捐倡议书
2015/04/27 职场文书
如何写辞职信
2015/05/13 职场文书
毕业论文致谢词
2015/05/14 职场文书
2015年数学教研组工作总结
2015/05/23 职场文书
搭讪开场白台词大全
2015/05/28 职场文书
一篇文章带你深入了解Mysql触发器
2021/08/02 MySQL