python 打印xml文档树_[Python]xml.etree.ElementTree处理xml文档
需求:
在实际应用中,需要对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文档相关推荐
- python【模块】xml.etree.ElementTree 解析 xml
pytho 模块 xml.etree.ElementTree 解析 xml 文章目录 pytho 模块 xml.etree.ElementTree 解析 xml 1. 什么是 XML? 2. Elem ...
- python里遍历筛选xml文件_python xml.etree.ElementTree遍历xml所有节点实例详解
python xml.etree.ElementTree遍历xml所有节点 XML文件内容: 代码: #-*- coding: UTF-8 -*- # 从文件中读取数据 import xml.etre ...
- python 打印对象的全部属性_详解:Python 面向对象静态方法、类方法、属性方法知识点小结...
今天为大家带来的内容是介绍了Python 面向对象静态方法.类方法.属性方法,总结分析了Python 面向对象程序设计中静态方法.类方法.属性方法相关概念.知识点.操作技巧与使用注意事项,需要的朋友可 ...
- python打印多个变量名_如何在Python中打印单个和多个变量?
请考虑下面Python 2.x中的两个Python代码片段.# Code 1 print 1 # Output: 1# Code 2 print(1) # Output: 1 在Python 2.X中 ...
- python打印100以内的素数_如何用python打印100以内的质数?
在计算机使用的过程中,计算是必不可少的.编程中含有大量的数学计算,可以帮助我们解决实际难操作的问题.有的时候我们会忘记质数是什么,之前小编向大家介绍过在python中判断质数的方法(判断数字是否为质数 ...
- windows下运行python打印有颜色的字_在windows下Python打印彩色字体的方法
本文讲述了Python在windows下打印彩色字体的方法.分享给大家供大家参考,具体如下: ##################################################### ...
- python中for循环的用法_@Python小白,一文让你掌握Python爬虫
兴趣 我没事喜欢逛知乎,有一段时间看到了这个问题:利用爬虫技术能做到哪些很酷很有趣很有用的事情: http://t.cn/RptGOPx 觉得回答的一个个炒鸡酷炫 就对爬虫产生了浓厚的兴趣, 于是就开 ...
- python三维图如何标注曲面_(python)使用colormap作为第4维,x,y,z函数绘制3d曲面 - python...
我正在尝试绘制3d曲面,其中三个维度中的每个维度都在单独的值数组中,并且每个坐标处的曲面着色是x,y,z的函数.一种numpy.pcolormesh,但是是4D而不是3D的. 3D图由下式给出: fr ...
- python打开excel执行vba代码_“Python替代Excel Vba”系列(终):vba中调用Python
请关注本号,后续会有更多相关教程. 系列文章 学Python还不会处理Excel数据?带你用pandas玩转各种数据处理"Python替代Excel Vba"系列(二):panda ...
最新文章
- 学籍管理系统 c语言流程图,程序设计基础 ——C语言第10章 综合应用案例——学生学籍管理系统...
- 免费学python的软件-此贴告诉你:为啥shell脚本人,不建议学python
- 软件管家公众号_软件安装管家:大学生最值得关注的公众号
- 「后端小伙伴来学前端了」CSS 做三角边框,必会的基础操作之一
- 滴水穿石-05数组排序
- python批量读取csv并写入_Python如何批量读取CSV文件中指定信息并写入doc文件命名中?...
- 文件上传与下载----SpringMVC
- 余承东感慨Mate系列:太艰辛了,质疑声太大
- ionic serve报错 spawn cmd ENOENT
- Windows Server 2003成员服务器基准用户权限分配策略
- Android进阶之利用Tablayout+ViewPager+Fragment实现神奇的滑动效果
- 智能优化算法改进算法 -附代码
- 单机搭建Android开发环境(二)
- Mac 输入法候选词框消失的解决方法
- Linux休眠唤醒流程分析之休眠流程框图
- 苹果电脑教程之退出ID账号
- Cinder调度之Filter介绍
- 本科生掀起“科研热”?该校本科生连发SCI,其中2篇顶刊
- 关于个人数据泄露通知的示例 Published by EDPB
- 微信小程序引入iconfont单色图标实例(Unicode方式)
热门文章
- Java Object Class boolean equals(Object o)方法与示例
- 【逆强化学习-1】学徒学习(Apprenticeship Learning)
- Oracle数据库中表格的级联删除问题
- C语言空指针NULL详解
- elf文件格式实例解析
- Docker Consul 安装及使用服务发现
- linux vnc 改端口号,基于Linux中vnc配置端口号的修改方法
- 文件打开特别慢_“Origin进不去、下载慢”的解决办法合集
- python远程登录并执行命令_Python - 远程SSH执行命令
- jlabel字怎么变化_疫情在家烦躁不如学习怎样练好字吧