如何根据条件替换XML指定标签值,按环境修改XML密码配置
需求说明
我们需要针对特定环境替换XML文件中存储的密码值:当匹配到<id>dev</id>对应的profile配置块时,将该块下的<oraclePassword>标签内容从原有值替换为目标密码,例如将<oraclePassword>dev1</oraclePassword>修改为<oraclePassword>devPassword</oraclePassword>。
参考配置文件settings.xml内容
$cat settings.xml <settings> <profiles> <profile> <id>dev</id> <properties> <oracleServerT3>t3://soa-server1-dev:7001</oracleServerT3> <oracleUsername>admin</oracleUsername> <oraclePassword>dev1</oraclePassword> </properties> </profile> <profile> <id>int</id> <properties> <oracleServerT3>t3://soa-server1-int:7001</oracleServerT3> <oracleUsername>admin</oracleUsername> <oraclePassword></oraclePassword> </properties> </profile> <profile> <id>usr</id> <properties> <oracleServerT3>t3://soa-server1-usr:7001</oracleServerT3> <oracleUsername>admin</oracleUsername> <oraclePassword>usr1</oraclePassword> </properties> </profile> </profiles> </settings>
可行实现方案
方案1:使用xmlstarlet命令行工具(推荐生产环境使用)
xmlstarlet是专门用于处理XML的命令行工具,基于XPath匹配,不会破坏XML原有结构,适配任意合法XML格式。
- 安装方法:
- Debian/Ubuntu:
apt install xmlstarlet - CentOS/RHEL:
yum install xmlstarlet - macOS:
brew install xmlstarlet
- Debian/Ubuntu:
- 替换dev环境密码命令:
xmlstarlet ed -P -S -L -u "/settings/profiles/profile[id='dev']/properties/oraclePassword" -v "devPassword" settings.xml
- 参数说明:
-P:保留原有缩进格式-S:保留原有空格规则-L:直接修改原文件,无需额外重定向输出-u:指定需要更新的XPath路径
方案2:使用Python脚本实现(跨平台通用)
大部分系统默认自带Python环境,无需额外安装依赖,灵活性高可自定义扩展。
import xml.etree.ElementTree as ET # 可修改配置项 target_env = "dev" # 要替换的环境id new_password = "devPassword" # 新密码 xml_file_path = "settings.xml" # XML文件路径 # 解析XML tree = ET.parse(xml_file_path) root = tree.getroot() # 遍历匹配对应环境的配置块 for profile in root.findall("./profiles/profile"): current_env = profile.find("id").text if current_env == target_env: # 替换对应密码值 profile.find("./properties/oraclePassword").text = new_password break # 保存修改后的文件 tree.write(xml_file_path, encoding="utf-8", xml_declaration=True)
方案3:sed命令快速处理(仅适合临时使用)
注意:该方案依赖XML的标签顺序、缩进格式固定,若XML结构有调整可能出现匹配错误,不推荐生产环境使用
sed -i '/<id>dev<\/id>/,/<\/properties>/ s/<oraclePassword>.*<\/oraclePassword>/<oraclePassword>devPassword<\/oraclePassword>/' settings.xml
内容的提问来源于stack exchange,提问作者Vivek Vishal
相关产品推荐
相关产品推荐

