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解析中国天气网的天气数据
Mar 21 Python
用ReactJS和Python的Flask框架编写留言板的代码示例
Dec 19 Python
python中ImageTk.PhotoImage()不显示图片却不报错问题解决
Dec 06 Python
Python这样操作能存储100多万行的xlsx文件
Apr 16 Python
Python增强赋值和共享引用注意事项小结
May 28 Python
python处理“
Jun 10 Python
连接pandas以及数组转pandas的方法
Jun 28 Python
Python3 tkinter 实现文件读取及保存功能
Sep 12 Python
Tensorflow 使用pb文件保存(恢复)模型计算图和参数实例详解
Feb 11 Python
利用python+ffmpeg合并B站视频及格式转换的实例代码
Nov 24 Python
Python基础知识之变量的详解
Apr 14 Python
如何利用opencv判断两张图片是否相同详解
Jul 07 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模拟HTTP认证
2006/10/09 PHP
php打包网站并在线压缩为zip
2016/02/13 PHP
PHP根据session与cookie用户登录状态操作类的代码
2016/05/13 PHP
PHP处理Ajax请求与Ajax跨域问题
2017/02/13 PHP
php中Swoole的热更新实现代码实例
2021/03/04 PHP
一实用的实现table排序的Javascript类库
2007/09/12 Javascript
jQuery UI Autocomplete 1.8.16 中文输入修正代码
2012/04/16 Javascript
jQuery链式操作如何实现以及为什么要用链式操作
2013/01/17 Javascript
node.js入门实例helloworld详解
2015/12/23 Javascript
AngularJS全局scope与Isolate scope通信用法示例
2016/11/22 Javascript
javascript实现二叉树的代码
2017/06/08 Javascript
使用prop解决一个checkbox选中后再次选中失效的问题
2017/07/05 Javascript
微信JSSDK调用微信扫一扫功能的方法
2017/07/25 Javascript
JS计算两个时间相差分钟数的方法示例
2018/01/10 Javascript
mpvue 如何使用腾讯视频插件的方法
2018/07/16 Javascript
JavaScript继承与聚合实例详解
2019/01/22 Javascript
ant design实现圈选功能
2019/12/17 Javascript
vue项目中微信登录的实现操作
2020/09/08 Javascript
[08:44]和酒神一起战斗 DOTA2教你做大人
2014/03/27 DOTA
python下paramiko模块实现ssh连接登录Linux服务器
2015/06/03 Python
python3读取MySQL-Front的MYSQL密码
2017/05/03 Python
Python使用defaultdict读取文件各列的方法
2017/05/11 Python
Python3.4编程实现简单抓取爬虫功能示例
2017/09/14 Python
使用python语言,比较两个字符串是否相同的实例
2018/06/29 Python
django orm 通过related_name反向查询的方法
2018/12/15 Python
python自动生成证件号的方法示例
2021/01/14 Python
教育学专业毕业生的自我鉴定
2013/11/26 职场文书
数控技术专科生自我评价
2014/01/08 职场文书
财务科科长岗位职责
2014/03/10 职场文书
中学生操行评语
2014/04/24 职场文书
铅球加油稿100字
2014/09/26 职场文书
普通党员四风问题对照检查材料
2014/09/27 职场文书
2015年元旦晚会活动总结(学生会)
2014/11/28 职场文书
小学学习委员竞选稿
2015/11/20 职场文书
详解如何使用Node.js实现热重载页面
2021/05/06 Javascript
为Java项目添加Redis缓存的方法
2021/05/18 Redis