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使用修饰器执行函数的参数检查功能示例
Sep 26 Python
终端命令查看TensorFlow版本号及路径的方法
Jun 13 Python
Python OpenCV之图片缩放的实现(cv2.resize)
Jun 28 Python
Python学习笔记之集合的概念和简单使用示例
Aug 22 Python
python常见字符串处理函数与用法汇总
Oct 30 Python
python标识符命名规范原理解析
Jan 10 Python
使用pandas库对csv文件进行筛选保存
May 25 Python
新版Pycharm中Matplotlib不会弹出独立的显示窗口的问题
Jun 02 Python
浅谈PyTorch中in-place operation的含义
Jun 27 Python
python里反向传播算法详解
Nov 22 Python
Django权限控制的使用
Jan 07 Python
浅谈Python数学建模之数据导入
Jun 23 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长字符串定义方法
2012/07/12 PHP
php操作csv文件代码实例汇总
2014/09/22 PHP
PHP简单获取多个checkbox值的方法
2016/06/13 PHP
PHP调试及性能分析工具Xdebug详解
2017/02/09 PHP
PHP从尾到头打印链表实例讲解
2018/09/27 PHP
JQuery与Ajax常用代码实现对比
2009/10/03 Javascript
JS中获取数据库中的值的方法
2013/07/14 Javascript
jQuery在iframe中无法弹出对话框的解决方法
2014/01/12 Javascript
HTML5+setCutomValidity()函数验证表单实例分享
2015/04/24 Javascript
JavaScript合并两个数组并去除重复项的方法
2015/06/13 Javascript
JS实现新浪微博效果带遮罩层的弹出框代码
2015/10/12 Javascript
JavaScript小技巧整理篇(非常全)
2016/01/26 Javascript
javascript函数中的3个高级技巧
2016/09/22 Javascript
Vue.js原理分析之observer模块详解
2017/02/17 Javascript
JS数组搜索之折半搜索实现方法分析
2017/03/27 Javascript
JavaScript设计模式之单例模式简单实例教程
2018/07/02 Javascript
JS实现压缩上传图片base64长度功能
2019/12/03 Javascript
JavaScript this指向相关原理及实例解析
2020/07/10 Javascript
[04:22]DSPL第二期精彩集锦:残血反杀!
2014/12/10 DOTA
python实现文本文件合并
2015/12/29 Python
python 获取毫秒数,计算调用时长的方法
2019/02/20 Python
Python第三方包之DingDingBot钉钉机器人
2020/04/09 Python
Python使用Pyqt5实现简易浏览器(最新版本测试过)
2020/04/27 Python
python基于Kivy写一个图形桌面时钟程序
2021/01/28 Python
python中zip()函数遍历多个列表方法
2021/02/18 Python
HTML5实现WebSocket协议原理浅析
2014/07/07 HTML / CSS
vivo智能手机官方商城:vivo
2016/09/22 全球购物
美国在线鲜花速递:ProFlowers
2017/01/05 全球购物
美国瑜伽品牌:Gaiam
2017/10/31 全球购物
编写函数,将一个3*3矩阵转置
2013/10/09 面试题
在网络中有两台主机A和B,并通过路由器和其他交换设备连接起来,已经确认物理连接正确无误,怎么来测试这两台机器是否连通?如果不通,怎么来判断故障点?怎么排
2014/01/13 面试题
实习教师自我鉴定
2013/12/12 职场文书
超级搞笑检讨书
2014/01/15 职场文书
好邻里事迹材料
2014/01/16 职场文书
节约用电标语
2014/06/17 职场文书
pytorch 运行一段时间后出现GPU OOM的问题
2021/06/02 Python