Python 2.6.6中使用ElementTree修改XML遇到命名空间问题
解决Python 2.6.6中ElementTree处理带命名空间XML的问题
在Python 2.6.6的ElementTree中处理带有命名空间的XML确实容易踩坑,尤其是默认命名空间(没有前缀的xmlns属性)的情况。下面是针对你的WebLogic JDBC数据源XML的具体解决方案:
1. 先注册命名空间,避免输出时出现自动生成的前缀
首先要注册所有用到的命名空间,这样在修改后保存XML时,能保持原有的命名空间前缀(比如sec、wls),不会被替换成ns0这类自动生成的前缀:
import xml.etree.ElementTree as ET # 注册XML中所有的命名空间 ET.register_namespace('', 'http://xmlns.oracle.com/weblogic/jdbc-data-source') # 默认命名空间 ET.register_namespace('sec', 'http://xmlns.oracle.com/weblogic/security') ET.register_namespace('xsi', 'http://www.w3.org/2001/XMLSchema-instance') ET.register_namespace('wls', 'http://xmlns.oracle.com/weblogic/security/wls')
2. 解析XML并正确查找元素
因为你的XML使用了默认命名空间,所有不带前缀的元素(比如<name>)都属于这个命名空间,直接用标签名查找会返回None。你有两种方式正确查找元素:
方式一:使用完整的命名空间URI包裹标签名
# 解析XML文件 tree = ET.parse('your_datasource.xml') root = tree.getroot() # 查找默认命名空间下的<name>元素 name_element = root.find('{http://xmlns.oracle.com/weblogic/jdbc-data-source}name')
方式二:用命名空间映射配合XPath查找
Python 2.6的ElementTree支持简单的XPath查询,你可以定义命名空间映射,让代码更易读:
# 定义命名空间映射 ns_map = { 'jdbc': 'http://xmlns.oracle.com/weblogic/jdbc-data-source', 'sec': 'http://xmlns.oracle.com/weblogic/security', 'wls': 'http://xmlns.oracle.com/weblogic/security/wls' } # 用XPath查找<name>元素 name_element = root.find('.//jdbc:name', namespaces=ns_map)
3. 修改元素并保存XML
找到元素后,就可以正常修改它的内容或属性,最后保存时记得指定编码和XML声明,保持和原文件一致:
# 修改<name>元素的文本内容 if name_element is not None: name_element.text = 'modified.wlng.datasource' # 保存修改后的XML tree.write('modified_datasource.xml', encoding='UTF-8', xml_declaration=True)
常见问题排查
- 找不到元素:检查是否忘记给默认命名空间的元素加上命名空间URI,或者XPath的命名空间映射是否正确。
- 保存后命名空间前缀变了:确保提前注册了所有用到的命名空间,否则ElementTree会自动生成
ns0这类前缀。 - XPath查询失败:Python 2.6的ElementTree对XPath的支持有限,避免使用复杂的XPath表达式,尽量用简单的
find/findall。
内容的提问来源于stack exchange,提问作者Subeesh KK
相关产品推荐
相关产品推荐

