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程序设计入门(1)基本语法简介
Jun 13 Python
django请求返回不同的类型图片json,xml,html的实例
May 22 Python
Python for循环生成列表的实例
Jun 15 Python
Python使用pyshp库读取shapefile信息的方法
Dec 29 Python
Python集中化管理平台Ansible介绍与YAML简介
Jun 12 Python
Python数据类型之列表和元组的方法实例详解
Jul 08 Python
python 两个数据库postgresql对比
Oct 21 Python
python循环输出三角形图案的例子
Nov 22 Python
python实现贪吃蛇双人大战
Apr 18 Python
django为Form生成的label标签添加class方式
May 20 Python
Python scrapy爬取小说代码案例详解
Jul 09 Python
Python实现迪杰斯特拉算法过程解析
Sep 18 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
preg_match_all使用心得分享
2014/01/31 PHP
PHP常用函数和常见疑难问题解答
2014/03/05 PHP
PHP高级编程实例:编写守护进程
2014/09/02 PHP
Laravel框架中实现使用阿里云ACE缓存服务
2015/02/10 PHP
基于jquery的让页面控件不可用的实现代码
2010/04/27 Javascript
JavaScript实现列表分页功能特效
2015/05/15 Javascript
详解Angular开发中的登陆与身份验证
2016/07/27 Javascript
node.js学习之base64编码解码
2016/10/21 Javascript
自己封装的一个原生JS拖动方法(推荐)
2016/11/22 Javascript
JavaScript cookie详解及简单实例应用
2016/12/31 Javascript
纯原生js实现table表格的增删
2017/01/05 Javascript
jQuery实现淡入淡出的模态框
2017/02/09 Javascript
Vue.js基础指令实例讲解(各种数据绑定、表单渲染大总结)
2017/07/03 Javascript
教你5分钟学会用requirejs(必看篇)
2017/07/25 Javascript
js jquery 获取某一元素到浏览器顶端的距离实现方法
2018/09/05 jQuery
vue模块拖拽实现示例代码
2019/03/09 Javascript
jQuery实现动态添加和删除input框实例代码
2019/03/26 jQuery
如何实现一个简易版的vuex持久化工具
2019/09/11 Javascript
Webpack中SplitChunksPlugin 配置参数详解
2020/03/24 Javascript
vue单文件组件无法获取$refs的问题
2020/06/24 Javascript
Python检测生僻字的实现方法
2016/10/23 Python
PyQt5每天必学之QSplitter实现窗口分隔
2018/04/19 Python
运用Python的webbrowser实现定时打开特定网页
2019/02/21 Python
Python自定义一个异常类的方法
2019/06/27 Python
twilio python自动拨打电话,播放自定义mp3音频的方法
2019/08/08 Python
Django中自定义查询对象的具体使用
2019/10/13 Python
django自定义模板标签过程解析
2019/12/14 Python
css3动画效果抖动解决方法
2018/09/03 HTML / CSS
基于HTML5新特性Mutation Observer实现编辑器的撤销和回退操作
2016/01/11 HTML / CSS
聪明的粉丝购买门票的地方:TickPick
2018/03/09 全球购物
程序运行正确, 但退出时却"core dump"了,怎么回事
2014/02/19 面试题
关于国庆节的演讲稿
2014/09/05 职场文书
个人先进材料范文
2014/12/30 职场文书
《夜莺的歌声》教学反思
2016/02/22 职场文书
各种货币符号快捷输入
2022/02/17 杂记
cypress测试本地web应用
2022/06/01 Javascript