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之有容乃大的list(1)
Sep 14 Python
Python+MongoDB自增键值的简单实现
Nov 04 Python
Python Tkinter模块实现时钟功能应用示例
Jul 23 Python
python pandas消除空值和空格以及 Nan数据替换方法
Oct 30 Python
Python XlsxWriter模块Chart类用法实例分析
Mar 11 Python
pytorch 可视化feature map的示例代码
Aug 20 Python
Python如何实现动态数组
Nov 02 Python
python实现人像动漫化的示例代码
May 17 Python
关于Kotlin中SAM转换的那些事
Sep 15 Python
Python 中random 库的详细使用
Jun 03 Python
python脚本框架webpy模板赋值实现
Nov 20 Python
用Python仅20行代码编写一个简单的端口扫描器
Apr 08 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读取html并截取字符串的简单代码
2009/11/30 PHP
php header功能的使用
2013/10/28 PHP
YII模块实现绑定二级域名的方法
2014/07/09 PHP
PHP实现适用于自定义的验证码类
2016/06/15 PHP
PHP文件操作简单介绍及函数汇总
2020/12/11 PHP
JavaScript DOM 添加事件
2009/02/14 Javascript
js 弹出框 替代浏览器的弹出框
2010/10/29 Javascript
jquery解决图片路径不存在执行替换路径
2013/02/06 Javascript
jquery 操作iframe的几种方法总结
2013/12/13 Javascript
jQuery中has()方法用法实例
2015/01/06 Javascript
JavaScript实现的Tween算法及缓冲特效实例代码
2015/11/03 Javascript
学习JavaScript设计模式(单例模式)
2015/11/26 Javascript
浅谈JS中逗号运算符的用法
2016/06/12 Javascript
jQuery实现公告新闻自动滚屏效果实例代码
2016/07/14 Javascript
tablesorter.js表格排序使用方法(支持中文排序)
2017/02/10 Javascript
完美解决iview 的select下拉框选项错位的问题
2018/03/02 Javascript
Vue + better-scroll 实现移动端字母索引导航功能
2018/05/07 Javascript
VUE中使用MUI方法
2019/02/12 Javascript
微信小程序与公众号卡券/会员打通的问题
2019/07/25 Javascript
Vue-cli3项目引入Typescript的实现方法
2019/10/18 Javascript
Vue-cli3多页面配置详解
2020/03/22 Javascript
小程序中使用css var变量(使js可以动态设置css样式属性)
2020/03/31 Javascript
Vue3为什么这么快
2020/09/23 Javascript
原生js实现点击按钮复制内容到剪切板
2020/11/19 Javascript
[36:05]DOTA2亚洲邀请赛 3.31 小组赛 A组 Liquid vs Optic
2018/04/01 DOTA
Python批量修改图片分辨率的实例代码
2019/07/04 Python
使用python-Jenkins批量创建及修改jobs操作
2020/05/12 Python
匈牙利最大的健身制造商和销售商:inSPORTline
2018/10/30 全球购物
Perfume’s Club意大利官网:欧洲美妆电商
2019/05/03 全球购物
医院护士求职自荐信格式
2013/09/21 职场文书
如何进行有效的自我评价
2013/09/27 职场文书
物流专业大学的自我评价
2014/01/11 职场文书
农村改厕实施方案
2014/03/22 职场文书
人民调解员培训方案
2014/06/05 职场文书
计生个人工作总结
2015/02/28 职场文书
HTML5 新增内容和 API详解
2021/11/17 HTML / CSS