如何使用Bash修改XML文件中connection.db属性的取值?
解决XMLStarlet修改带命名空间的XML节点问题
你的XML文件包含命名空间(xmlns="urn:nhibernate-configuration-2.2"),所有子元素都属于这个命名空间,之前的XPath因为没有处理命名空间,所以无法匹配到目标节点。以下是两种可行的解决方案:
方案1:显式指定命名空间前缀
使用-N参数定义命名空间前缀,在XPath中通过前缀引用元素:
# 输出修改后的内容到终端 xmlstarlet ed -N ns=urn:nhibernate-configuration-2.2 -u "/ns:hibernate-configuration/ns:session-factory/ns:property[@name='connection.db']" -v '4' test1.config # 直接原地修改原文件(加-L参数) xmlstarlet ed -L -N ns=urn:nhibernate-configuration-2.2 -u "/ns:hibernate-configuration/ns:session-factory/ns:property[@name='connection.db']" -v '4' test1.config
方案2:通过本地名称匹配(忽略命名空间)
如果不想处理命名空间,可以用local-name()函数匹配元素的本地名称:
# 输出修改后的内容到终端 xmlstarlet ed -u "//*[local-name()='session-factory']/*[local-name()='property'][@name='connection.db']" -v '4' test1.config # 直接原地修改原文件 xmlstarlet ed -L -u "//*[local-name()='session-factory']/*[local-name()='property'][@name='connection.db']" -v '4' test1.config
执行上述命令后,test1.config中name="connection.db"的<property>标签内容会被修改为4。
内容的提问来源于stack exchange,提问作者Sosh
相关产品推荐
相关产品推荐

