需求:

在实际应用中,需要对xml配置文件进行实时修改,

1.增加、删除 某些节点

2.增加,删除,修改某个节点下的某些属性

3.增加,删除,修改某些节点的文本

xml源文件格式[例]

path="/tmp">

output_formatter="OutPutFormatter:service_inc">

使用库:

xml.etree.ElementTree

实现思想:

使用ElementTree,先将文件读入,解析成树,之后,根据路径,可以定位到树的每个节点,再对节点进行修改,最后直接将其输出

代码附文档:

#!/usr/bin/python

# -*- coding=utf-8 -*-

# author : wklken@yeah.net

# date: 2012-05-25

# version: 0.1

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("./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, "./out.xml")

通过main处理后的结果文件:

this is the firest content

this is the firest content

prefix="/bin/search?">

new text

python 打印xml文档树_[Python]xml.etree.ElementTree处理xml文档相关推荐

  1. python【模块】xml.etree.ElementTree 解析 xml

    pytho 模块 xml.etree.ElementTree 解析 xml 文章目录 pytho 模块 xml.etree.ElementTree 解析 xml 1. 什么是 XML? 2. Elem ...

  2. python里遍历筛选xml文件_python xml.etree.ElementTree遍历xml所有节点实例详解

    python xml.etree.ElementTree遍历xml所有节点 XML文件内容: 代码: #-*- coding: UTF-8 -*- # 从文件中读取数据 import xml.etre ...

  3. python 打印对象的全部属性_详解:Python 面向对象静态方法、类方法、属性方法知识点小结...

    今天为大家带来的内容是介绍了Python 面向对象静态方法.类方法.属性方法,总结分析了Python 面向对象程序设计中静态方法.类方法.属性方法相关概念.知识点.操作技巧与使用注意事项,需要的朋友可 ...

  4. python打印多个变量名_如何在Python中打印单个和多个变量?

    请考虑下面Python 2.x中的两个Python代码片段.# Code 1 print 1 # Output: 1# Code 2 print(1) # Output: 1 在Python 2.X中 ...

  5. python打印100以内的素数_如何用python打印100以内的质数?

    在计算机使用的过程中,计算是必不可少的.编程中含有大量的数学计算,可以帮助我们解决实际难操作的问题.有的时候我们会忘记质数是什么,之前小编向大家介绍过在python中判断质数的方法(判断数字是否为质数 ...

  6. windows下运行python打印有颜色的字_在windows下Python打印彩色字体的方法

    本文讲述了Python在windows下打印彩色字体的方法.分享给大家供大家参考,具体如下: ##################################################### ...

  7. python中for循环的用法_@Python小白,一文让你掌握Python爬虫

    兴趣 我没事喜欢逛知乎,有一段时间看到了这个问题:利用爬虫技术能做到哪些很酷很有趣很有用的事情: http://t.cn/RptGOPx 觉得回答的一个个炒鸡酷炫 就对爬虫产生了浓厚的兴趣, 于是就开 ...

  8. python三维图如何标注曲面_(python)使用colormap作为第4维,x,y,z函数绘制3d曲面 - python...

    我正在尝试绘制3d曲面,其中三个维度中的每个维度都在单独的值数组中,并且每个坐标处的曲面着色是x,y,z的函数.一种numpy.pcolormesh,但是是4D而不是3D的. 3D图由下式给出: fr ...

  9. python打开excel执行vba代码_“Python替代Excel Vba”系列(终):vba中调用Python

    请关注本号,后续会有更多相关教程. 系列文章 学Python还不会处理Excel数据?带你用pandas玩转各种数据处理"Python替代Excel Vba"系列(二):panda ...

最新文章

  1. 学籍管理系统 c语言流程图,程序设计基础 ——C语言第10章 综合应用案例——学生学籍管理系统...
  2. 免费学python的软件-此贴告诉你:为啥shell脚本人,不建议学python
  3. 软件管家公众号_软件安装管家:大学生最值得关注的公众号
  4. 「后端小伙伴来学前端了」CSS 做三角边框,必会的基础操作之一
  5. 滴水穿石-05数组排序
  6. python批量读取csv并写入_Python如何批量读取CSV文件中指定信息并写入doc文件命名中?...
  7. 文件上传与下载----SpringMVC
  8. 余承东感慨Mate系列:太艰辛了,质疑声太大
  9. ionic serve报错 spawn cmd ENOENT
  10. Windows Server 2003成员服务器基准用户权限分配策略
  11. Android进阶之利用Tablayout+ViewPager+Fragment实现神奇的滑动效果
  12. 智能优化算法改进算法 -附代码
  13. 单机搭建Android开发环境(二)
  14. Mac 输入法候选词框消失的解决方法
  15. Linux休眠唤醒流程分析之休眠流程框图
  16. 苹果电脑教程之退出ID账号
  17. Cinder调度之Filter介绍
  18. 本科生掀起“科研热”?该校本科生连发SCI,其中2篇顶刊
  19. 关于个人数据泄露通知的示例 Published by EDPB
  20. 微信小程序引入iconfont单色图标实例(Unicode方式)

热门文章

  1. Java Object Class boolean equals(Object o)方法与示例
  2. 【逆强化学习-1】学徒学习(Apprenticeship Learning)
  3. Oracle数据库中表格的级联删除问题
  4. C语言空指针NULL详解
  5. elf文件格式实例解析
  6. Docker Consul 安装及使用服务发现
  7. linux vnc 改端口号,基于Linux中vnc配置端口号的修改方法
  8. 文件打开特别慢_“Origin进不去、下载慢”的解决办法合集
  9. python远程登录并执行命令_Python - 远程SSH执行命令
  10. jlabel字怎么变化_疫情在家烦躁不如学习怎样练好字吧