使用xml.etree.ElementTree修改activemq.xml无法保留原有命名空间怎么办
解决Python修改ActiveMQ配置XML时命名空间前缀异常问题
问题原因
- 重复给空前缀注册不同命名空间,后注册的会覆盖前者,导致未匹配到正确前缀的命名空间被自动分配ns0、ns1等前缀
- 用硬编码索引定位节点稳定性差,XML结构稍有变动就会修改错误节点
- 输出XML时未指定合适的写入参数,容易丢失XML声明、编码标识
修复后可直接使用的代码
#!/usr/bin/env python3 import xml.etree.ElementTree as ET # 按原文件实际命名空间前缀映射注册,不要重复给空前缀绑定多个命名空间 # 以下是activemq.xml默认的命名空间映射,如有自定义前缀请对应调整 ET.register_namespace('', 'http://activemq.apache.org/schema/core') ET.register_namespace('beans', 'http://www.springframework.org/schema/beans') ET.register_namespace('xsi', 'http://www.w3.org/2001/XMLSchema-instance') # 解析原文件 tree = ET.parse('activemq.xml') root = tree.getroot() # 用命名空间路径查找目标节点,比硬编码索引更稳定 ns = {'amq': 'http://activemq.apache.org/schema/core'} kaha_db_elem = root.find('.//amq:persistenceAdapter/amq:kahaDB', namespaces=ns) # 修改属性 if kaha_db_elem is not None: kaha_db_elem.attrib['directory'] = '/nfs' else: raise ValueError("未找到persistenceAdapter下的kahaDB节点,请检查XML结构") # 写入文件时指定参数,保留声明和编码 tree.write( 'activemqbak.xml', encoding='UTF-8', xml_declaration=True, method='xml' )
额外说明
- 如果你的原XML有其他自定义命名空间前缀,只要对应增加
ET.register_namespace(前缀, 命名空间URI)的注册项即可 - 用路径查找节点的方式兼容绝大多数ActiveMQ默认配置,不会因为标签顺序调整导致修改错误
内容的提问来源于stack exchange,提问作者M4CHINE
相关产品推荐
相关产品推荐

