程序员文章、书籍推荐和程序员创业信息与资源分享平台

网站首页 > 技术文章 正文

XML处理神器:Python类库让你轻松实现复杂XML操作和数据修改

hfteth 2024-12-24 10:35:30 技术文章 9 ℃

引言:

代码提供了一些方法来加载、修改、查询和保存 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 文件中的内容

Tags:

最近发表
标签列表