网站首页 > 技术文章 正文
引言:
代码提供了一些方法来加载、修改、查询和保存 XML 数据。构造函数初始化时接收一个 XML 文件路径(参数可变,可用性更高),方便在后续方法中加载该 XML 文件进行处理。
代码封装如下:
import xml.etree.ElementTree as ET
class XMLHandler:
def __init__(self, filepath):
"""
初始化方法,接受XML文件路径并进行初始化
"""
self.filepath = filepath #todo 存储文件路径
self.tree = None #todo 初始化为空树
self.root = None #todo 初始化根节点为空
def load_xml(self):
"""
加载并解析XML文件
"""
try:
#todo 解析XML文件并获取根节点
self.tree = ET.parse(self.filepath)
self.root = self.tree.getroot()
except ET.ParseError:
print("XML文件解析失败!")
def print_xml_content(self):
"""
打印XML文件的内容,递归显示元素和属性
"""
self.load_xml() #todo 加载XML文件
def recursive_print(element, indent=""):
"""
递归打印元素的标签、属性和值
"""
print(f"{indent}标签:{element.tag}, 属性:{element.attrib}") #todo 打印当前元素标签和属性
if element.text:
print(f"{indent}文本:{element.text.strip()}") #todo 打印当前元素文本内容
for child in element: #todo 递归打印子元素
recursive_print(child, indent + ' ') #todo 缩进显示
recursive_print(self.root) #todo 从根节点开始递归打印
def save_xml(self, output_filepath):
"""
保存修改后的XML文件
"""
try:
#todo 将XML树写入文件
self.tree.write(output_filepath, encoding="utf-8", xml_declaration=True)
print("XML文件保存成功!")
except IOError:
print("XML文件保存失败!")
def find_elements(self, xpath):
"""
根据xpath查找并返回匹配的元素
"""
self.load_xml() #todo 加载XML文件
elements = self.root.findall(xpath) #todo 使用xpath查找元素
if elements:
return elements #todo 如果找到元素,返回
else:
print("未找到匹配的元素!")
return [] #todo 如果未找到,返回空列表
def display_element(self, xpath):
"""
打印匹配xpath的所有元素
"""
elements = self.find_elements(xpath) #todo 查找元素
if elements:
for element in elements:
#todo 打印元素的字符串表示
element_str = ET.tostring(element, encoding="utf-8").decode("utf-8")
print(element_str)
else:
print("未找到匹配的元素!")
def display_element_with_attribute(self, attribute, value):
"""
根据属性和值显示匹配的元素
"""
self.load_xml() #todo 加载XML文件
target_node = None #todo 初始化目标节点为None
#todo 遍历所有节点,查找属性匹配的元素
for node in self.root.iter():
if attribute in node.attrib and node.attrib.get(attribute) == value:
target_node = node
break #todo 找到匹配的节点后跳出循环
if target_node:
print(target_node.attrib) #todo 输出该节点的属性
else:
print('未找到匹配的节点')
def add_element_with_attribute(self, attribute, value, add_attribute, add_value):
"""
向匹配的元素添加属性
"""
self.load_xml() #todo 加载XML文件
target_node = None #todo 初始化目标节点为None
#todo 查找属性匹配的元素
for node in self.root.iter():
if attribute in node.attrib and node.attrib.get(attribute) == value:
target_node = node
break
if target_node:
target_node.set(add_attribute, add_value) #todo 添加新属性
print("属性已添加")
else:
print('未找到匹配的节点')
self.save_xml(output_filepath=self.filepath) #todo 保存修改后的XML文件
def add_element_with_custom_name(self, tag_name, old_name, new_name):
"""
根据旧的name属性值添加一个新的元素,并修改其name为new_name
"""
self.load_xml() #todo 加载XML文件
for element in self.root.findall(tag_name): #todo 查找所有指定标签
if element.get('name') == old_name:
new_element = ET.Element(tag_name) #todo 创建新元素
#todo 复制所有属性,修改name属性
for attr, value in element.items():
if attr == 'name':
value = new_name
new_element.set(attr, value)
self.root.append(new_element) #todo 将新元素添加到根节点
self.save_xml(output_filepath=self.filepath) #todo 保存修改后的XML文件
def remove_attribute_from_xml(self, attribute_name):
"""
删除所有节点中指定的属性
"""
self.load_xml() #todo 加载XML文件
#todo 遍历所有节点并删除指定属性
for element in self.root.iter():
if attribute_name in element.attrib:
del element.attrib[attribute_name]
self.save_xml(output_filepath=self.filepath) #todo 保存修改后的XML文件
def remove_element_by_name(self, tag_name, name):
"""
删除具有指定name属性值的元素
"""
self.load_xml() #todo 加载XML文件
for element in self.root.findall(tag_name): #todo 查找所有指定标签的元素
if element.get('name') == name:
self.root.remove(element) #todo 从根节点中移除该元素
self.save_xml(output_filepath=self.filepath) #todo 保存修改后的XML文件
def replace_element_by_name(self, tag_name, name, value, new_value):
"""
替换指定name属性值的元素的某个属性值
"""
self.load_xml() #todo 加载XML文件
for element in self.root.findall(tag_name): #todo 查找所有指定标签的元素
if element.get('name') == name:
element.set(value, new_value) #todo 设置新的属性值
self.save_xml(output_filepath=self.filepath) #todo 保存修改后的XML文件
if __name__ == '__main__':
#todo 实例化XMLHandler对象并测试
xml_handler = XMLHandler(r"D:\KCBPSPD.xml")
tag_name = 'program' #todo 标签名称
name = '150831' #todo 要查找的name属性值
xml_handler.replace_element_by_name(tag_name, name, value='node', new_value='3') #todo 替换属性值
适用场景
该封装的类 适用于需要对 XML 文件进行读取、修改和保存的场景,
比如:配置文件管理数据存储格式为 XML 的应用自动化脚本,需要动态修改或查询 XML 文件中的内容
猜你喜欢
- 2024-12-24 使用python实现九九乘法口诀表,使用这个语法,只需一行代码
- 2024-12-24 Python PyInstaller安装和使用教程
- 2024-12-24 pyinstaller,一个超酷的 Python 库!
- 2024-12-24 Python中Pyinstaller库的安装方法(全)
- 2024-12-24 Python音频处理的新选择:深入探索PyAudioMixer库
- 2024-12-24 PyUSB——使用Python链接USB设备
- 2024-12-24 Python+MySQL数据库操作(PyMySQL)
- 2024-12-24 Python 简单实现贪吃蛇小游戏
- 2024-12-24 不要钱,用Python识别图片中的文字
- 2024-12-24 掌握Pymysql轻松实现Python数据库编程
- 05-25Python 3.14 t-string 要来了,它与 f-string 有何不同?
- 05-25Python基础元素语法总结
- 05-25Python中的变量是什么东西?
- 05-25新手常见的python报错及解决方案
- 05-2511-Python变量
- 05-2510个每个人都是需要知道Python问题
- 05-25Python编程:轻松掌握函数定义、类型及其参数传递方式
- 05-25Python基础语法
- 257℃Python短文,Python中的嵌套条件语句(六)
- 257℃python笔记:for循环嵌套。end=""的作用,图形打印
- 256℃PythonNet:实现Python与.Net代码相互调用!
- 251℃Python操作Sqlserver数据库(多库同时异步执行:增删改查)
- 251℃Python实现字符串小写转大写并写入文件
- 106℃原来2025是完美的平方年,一起探索六种平方的算吧
- 90℃Python 和 JavaScript 终于联姻了!PythonMonkey 要火?
- 81℃Ollama v0.4.5-v0.4.7 更新集合:Ollama Python 库改进、新模型支持
- 最近发表
- 标签列表
-
- python中类 (31)
- python 迭代 (34)
- python 小写 (35)
- python怎么输出 (33)
- python 日志 (35)
- python语音 (31)
- python 工程师 (34)
- python3 安装 (31)
- python音乐 (31)
- 安卓 python (32)
- python 小游戏 (32)
- python 安卓 (31)
- python聚类 (34)
- python向量 (31)
- python大全 (31)
- python次方 (33)
- python桌面 (32)
- python总结 (34)
- python浏览器 (32)
- python 请求 (32)
- python 前端 (32)
- python验证码 (33)
- python 题目 (32)
- python 文件写 (33)
- python中的用法 (32)