LXML+Python如何定位并修改同<Setting>下指定<Property>对应的<Value_1>值
解决方案
核心实现思路是通过带筛选条件的XPath表达式,直接定位到目标Property对应的Setting节点下的Value_1节点,无需额外查找父节点,逻辑简洁高效。
完整可运行代码
from lxml import etree # 读取XML文件 tree = etree.parse('C:/temp/myxml.xml') # 一步定位到Property为"Setting Name 3"对应的Value_1节点 target_value_nodes = tree.xpath('//Setting[Property/text()="Setting Name 3"]/Value_1') if target_value_nodes: # 取第一个匹配的节点(常规场景下配置项的Property名称是唯一的) value_node = target_value_nodes[0] # 注意:节点text是字符串类型,要和字符串"True"比较,不能直接用Python布尔值True判断 if value_node.text == "True": value_node.text = "False" # 将修改后的内容写回原文件,参数和原XML格式保持一致 tree.write('C:/temp/myxml.xml', encoding='utf-8', xml_declaration=True, standalone=True)
关键说明
- XPath表达式
//Setting[Property/text()="Setting Name 3"]/Value_1中的方括号为筛选条件,只会匹配<Property>子节点文本等于指定值的<Setting>节点,再直接取该节点下的<Value_1>子节点 - 如果需要实现通用的配置修改能力,可以封装为工具函数,示例如下:
def modify_setting_value(xml_tree, property_name, target_value): """ 修改指定配置项的Value_1值 :param xml_tree: lxml读取的XML树对象 :param property_name: 配置项的Property名称 :param target_value: 要设置的新值 :return: 修改成功返回True,未找到对应配置返回False """ value_list = xml_tree.xpath(f'//Setting[Property/text()="{property_name}"]/Value_1') if not value_list: return False value_list[0].text = str(target_value) return True # 调用示例:将Setting Name 4的值改为False modify_setting_value(tree, "Setting Name 4", "False")
- 修改完成后必须调用
tree.write()方法才能将改动持久化到文件中,编码、声明等参数建议和原文件保持一致,避免格式错乱。
内容的提问来源于stack exchange,提问作者anakaine
相关产品推荐
相关产品推荐

