所以我有一个 XML 文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>platform</artifactId>
<groupId>com.test.aem</groupId>
<version>6.1.1-SNAPSHOT</version>
</parent>
我想将 的值更新version
为新值
<version>6.5.0-SNAPSHOT</version>
但我想确保它仅在本节中更新<parent>
,而不是文件中的其他任何地方。使用 bash 可以吗?
遗憾的是我无法使用,xmlstarlet
因为它不包含在容器中。
答案1
撇开 XML 片段的格式不正确(您错过了尾随</project>
元素结束)并修复它不谈,正确的答案是您应该使用 XML 解析器来解析和编辑 XML。
xmlstarlet edit --update '/_:project/_:parent/_:version' --value '6.5.0-SNAPSHOT' pom.xml
<?xml version="1.0"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>platform</artifactId>
<groupId>com.test.aem</groupId>
<version>6.5.0-SNAPSHOT</version>
</parent>
</project>
每个元素名称的前缀_:
是必需的通配符,因为您位于单独的命名空间 ( xmlns=...
) 中。
您当然可以将输出写入临时文件,然后用结果替换原始文件。或者xmlstarlet edit --inplace
,如果您绝对确定所做的编辑有效,则可以使用。
答案2
另一个可供探索的选项是 python,以防 xmlstarlet 实用程序不存在。
我们使用该etree
模块来遍历 XML 层次结构并修改版本。
python3 -c 'import sys, xml.etree.ElementTree as ET
#> unpack command line arguments
new_ver,xml_file = sys.argv[1:]
#>
tree = ET.parse(xml_file)
root = tree.getroot()
#> traverse,selec, & modify the desired
#> node using XPath expressions
for e in root.findall("./parent/version"):
e.text = new_ver
# save changes
tree.write(xml_file)
' "6.5.0-SNAPSHOT" input.xml