文章目录
- 一、使用背景
- 二、实现效果
- 三、内置库的使用
- 四、代码实现解析
- 五、完整代码
一、使用背景
我们在某些情况下需要对XML格式的文件进行内容处理,可以直接打开处理,但是对于一些需要自动化或者不方便手动处理的情况下我们的代码实现就比较关键啦,此处我是修改ant的build.xml文件来实现的。
二、实现效果
最终实现的效果是:把我们指定需要修改的内容进行变更,这里我是在需要的时候变更执行jmx脚本的顺序,也就是修改图中圈起来的地方,利用python代码的灵活性不断修改build.xml文件实现控制ant执行不同的.jmx脚本达到生成不同的报告的目的
三、内置库的使用
在修改xml文件的过程中我们需要借助的是python的内置库:xml.etree.ElementTree
,ElementTree库中提供了多种xml节点操作以及元素操作的方法:可以参考这位大神的讲解:https://blog.csdn.net/weixin_43956958/article/details/121986040
导入库的方式:import xml.etree.ElementTree as ET 【为了方便使用我们给起一个别名】
四、代码实现解析
1、在导入ElementTree库之后
import xml.etree.ElementTree as ET
2、打开本地xml文件
doc = ET.parse(xml_path)
root = doc.getroot()【getroot()代表读取节点内容】
3、获取根目录下的节点
root.find('这里是需要查找的节点路径jsonpath')
root.find('.//testplans')
root.find('.//property[@name = "ReportName"]')
sub1 = root.find('.//testplans')
4、对节点进行内容变更
4.1 新增并关联节点
方法一:单独创建节点进行关联
# 创建一个标签tagName1
tagName1 = ET.Element("节点名称", {"属性名":"属性值"})
# 将标签tagName1作为root的子标签
root.append(tagName1 )
# 将标签tagName1作为sub1 的子标签
sub1.append(tagName1 )
方法二:直接在节点下创建节点关联
root.makeelement("节点名称", {"属性名":"属性值"})
sub1.makeelement("节点名称", {"属性名":"属性值"})
4.2 编辑节点属性
4.2.1 新增属性
sub1 = root.find('.//testplans')
sub1.set('新增的属性名称', '新增属性value值')
sub1.set('name','new')
sub1.text="新增的text值"
4.2.2 修改属性
sub1 = root.find('.//testplans')
sub1.set('需要修改的的属性名称', '修改后的属性value值')
sub1.set('includes','1111.jmx')
sub1.text="修改的text值"
4.2.3 删除属性
subl..attrib.pop('属性名')
subl..attrib.pop('includes')
4.3 删除节点
root.remove('节点定位')
root.remove(sub1)
4.4 保存变更写入文件
保存内容
tree = ET.ElementTree(root)
写入文件
doc.write(文件路径, encoding='utf-8', xml_declaration=True)
五、完整代码
# 修改本地xml文件
def change_xml(xml_path, change_list):
'''
修改本地xml文件
xml_path:xml路径
change_list:需要修改内容,[{'xml_json_path': 'json_path路径', 'data':{'元素属性名称':'元素属性值'}}]例子:[{'xml_json_path': './/property[@name = "ReportName"]', 'data':{'value':'666955555'}}]
'''
print(xml_path)
# 打开xml文件
doc = ET.parse(xml_path)
root = doc.getroot()
for change in change_list:
# 查找修改路径
sub1 = root.find(change['xml_json_path'])
# 修改标签内容
for key, value in change['data'].items():
# 修改内容
sub1.set(key, value)
# 保存修改
doc.write(xml_path)
doc.write(xml_path, encoding='utf-8', xml_declaration=True)