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 相关文章推荐
python2与python3共存问题的解决方法
Sep 18 Python
Django实现单用户登录的方法示例
Mar 28 Python
值得收藏的10道python 面试题
Apr 15 Python
对python3 Serial 串口助手的接收读取数据方法详解
Jun 12 Python
Python装饰器用法与知识点小结
Mar 09 Python
Python读取配置文件(config.ini)以及写入配置文件
Apr 08 Python
Python模拟登入的N种方式(建议收藏)
May 31 Python
python cv2.resize函数high和width注意事项说明
Jul 05 Python
Django配置Bootstrap, js实现过程详解
Oct 13 Python
基于python爬取链家二手房信息代码示例
Oct 21 Python
2021年pycharm的最新安装教程及基本使用图文详解
Apr 03 Python
python Tkinter的简单入门教程
Apr 11 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
一个比较简单的PHP 分页分组类
2009/12/10 PHP
php simplexmlElement操作xml的命名空间实现代码
2011/01/04 PHP
js和php邮箱地址验证的实现方法
2014/01/09 PHP
PHP实现JS中escape与unescape的方法
2016/07/11 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
2018/06/16 PHP
javascript 同时在IE和FireFox获取KeyCode的代码
2010/02/07 Javascript
php 中序列化和json使用介绍
2013/07/08 Javascript
一个简单的jQuery计算器实现了连续计算功能
2014/07/21 Javascript
js星星评分效果
2014/07/24 Javascript
JavaScript清空数组元素的两种方法简单比较
2015/07/10 Javascript
jQuery插件编写步骤详解
2016/06/03 Javascript
JavaScript数组去重由慢到快由繁到简(优化篇)
2016/08/26 Javascript
JQuery 获取多个select标签option的text内容(实例)
2017/09/07 jQuery
使用JSON格式提交数据到服务端的实例代码
2018/04/01 Javascript
vue element项目引入icon图标的方法
2018/06/06 Javascript
JS集合set类的实现与使用方法示例
2019/02/01 Javascript
深入理解react 组件类型及使用场景
2019/03/07 Javascript
Vue 使用beforeEach实现登录状态检查功能
2019/10/31 Javascript
js简单实现自动生成表格功能示例
2020/06/02 Javascript
[01:08:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS LGD-CDEC
2014/05/22 DOTA
Python装饰器decorator用法实例
2014/11/10 Python
Python制作钉钉加密/解密工具
2016/12/07 Python
Python利用正则表达式实现计算器算法思路解析
2018/04/25 Python
python文字转语音的实例代码分析
2019/11/12 Python
wxpython绘制圆角窗体
2019/11/18 Python
python导入库的具体方法
2020/06/18 Python
突袭HTML5之Javascript API扩展2—地理信息服务及地理位置API学习
2013/01/31 HTML / CSS
详解HTML5中download属性的应用
2015/08/06 HTML / CSS
美国知名的时尚购物网站:Anthropologie
2016/12/22 全球购物
儿科护士自我鉴定
2013/10/14 职场文书
咖啡店自主创业商业计划书
2014/01/22 职场文书
简易版租房协议书范本
2014/10/13 职场文书
开业典礼致辞
2015/07/29 职场文书
MySQL 十大常用字符串函数详解
2021/06/30 MySQL
Python实现学生管理系统并生成exe可执行文件详解流程
2022/01/22 Python
SpringBoot中HttpSessionListener的简单使用方式
2022/03/17 Java/Android