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 过滤字符串的技巧,map与itertools.imap
Sep 06 Python
python按照多个字符对字符串进行分割的方法
Mar 17 Python
python+selenium开发环境搭建图文教程
Aug 11 Python
Python制作词云的方法
Jan 03 Python
Python实现多属性排序的方法
Dec 05 Python
5分钟 Pipenv 上手指南
Dec 20 Python
使用Python中的reduce()函数求积的实例
Jun 28 Python
django之静态文件 django 2.0 在网页中显示图片的例子
Jul 28 Python
Python 合并多个TXT文件并统计词频的实现
Aug 23 Python
python Web flask 视图内容和模板实现代码
Aug 23 Python
SpringBoot首页设置解析(推荐)
Feb 11 Python
单身狗福利?Python爬取某婚恋网征婚数据
Jun 03 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代码
2008/04/09 PHP
利用JQuery+EasyDrag 实现弹出可拖动的Div,同时向Div传值,然后返回Div选中的值
2009/10/24 Javascript
extjs grid设置某列背景颜色和字体颜色的实现方法
2010/09/06 Javascript
浅说js变量
2011/05/25 Javascript
复制js对象方法(详解)
2013/07/08 Javascript
js实现跟随鼠标移动且带关闭功能的图片广告实例
2015/02/26 Javascript
Javascript中的高阶函数介绍
2015/03/15 Javascript
js面向对象之公有、私有、静态属性和方法详解
2015/04/17 Javascript
Javascript动画效果(1)
2016/10/11 Javascript
JS操作input标签属性checkbox全选的实现代码
2017/03/02 Javascript
jQuery插件zTree实现删除树子节点的方法示例
2017/03/08 Javascript
js 用于检测类数组对象的函数方法
2017/05/02 Javascript
详解vue跨组件通信的几种方法
2017/06/15 Javascript
使用D3.js构建实时图形的示例代码
2018/08/28 Javascript
利用Vue-draggable组件实现Vue项目中表格内容的拖拽排序
2019/06/07 Javascript
深入解析koa之异步回调处理
2019/06/17 Javascript
jQuery实现获取多选框的值示例
2020/02/07 jQuery
uni-app实现获取验证码倒计时功能
2020/11/01 Javascript
[03:00]《DAC最前线》之欧美新秀VS老将
2015/02/01 DOTA
python中input()与raw_input()的区别分析
2016/02/27 Python
使用 Python 实现微信公众号粉丝迁移流程
2018/01/03 Python
pandas 小数位数 精度的处理方法
2018/06/09 Python
python 列表输出重复值以及对应的角标方法
2019/06/11 Python
Bibloo奥地利:购买女装、男装、童装、鞋和配件
2018/10/18 全球购物
Notino芬兰:购买香水和化妆品
2019/04/15 全球购物
瀑布模型都有哪些优缺点
2014/06/23 面试题
销售会计工作职责
2013/12/02 职场文书
销售实习自我鉴定
2013/12/07 职场文书
结婚周年感言
2014/02/24 职场文书
人力管理专业毕业生求职信
2014/02/27 职场文书
论文评审意见
2015/06/05 职场文书
初中班主任心得体会
2016/01/07 职场文书
2016年“9.22”世界无车日活动小结
2016/04/05 职场文书
十大最强飞行系宝可梦,BUG燕上榜,第二是飞行系王者
2022/03/18 日漫
教你在 Java 中实现 Dijkstra 最短路算法的方法
2022/04/08 Java/Android
Mysql数据库事务的脏读幻读及不可重复读详解
2022/05/30 MySQL