我正在尝试使用 bash 创建一个脚本来任意运行 JBoss XML 配置文件,并且当我看到特定标签时,将一些自定义值放入其中。
下面的 XML 是 JBoss 示例中 XML 配置文件的重要片段。我需要做的是找到<jvm>
服务器组标签中的标签,然后检查该<jvm-options>
标签是否存在。如果没有,则添加;如果存在,则添加<options>
包含其中值的标签。
<server-groups>
<server-group name="main-server-group" profile="full">
<jvm name="default">
<heap size="64m" max-size="512m"/>
<jvm-options>
<option value="-agentpath:"<DT_HOME>/agent/lib/libdtagent.so"=name=<AgentName>,server=<dynaTraceCollectorName>"/>
</jvm-options>
</jvm>
<socket-binding-group ref="full-sockets"/>
</server-group>
</server-groups>
</domain>
答案1
使用 XMLStarlet,您可以向元素添加子节点,也可以更新现有元素。为了涵盖元素存在和不存在的情况,我们可以
- 删除该元素。
- 添加具有我们希望其具有的值的元素。
假设我们要添加的元素是<newtag>
且其值应该是tagval
。它还应该有一个属性 ,newattr
其值为attrval
。这意味着我们要添加的是
<newtag newattr="attrval">tagval</newtag>
要删除元素:
$ xmlstarlet ed -d '//server-group/newtag' file.xml
要添加具有属性的元素:
$ xmlstarlet ed -s '//server-group' -t elem -n 'newtag' -v 'tagval' \
-s '//server-group/newtag' -t attr -n 'newattr' -v 'attrval' file.xml
将这些加在一起:
$ xmlstarlet ed -d '//server-group/newtag' \
-s '//server-group' -t elem -n 'newtag' -v 'tagval' \
-s '//server-group/newtag' -t attr -n 'newattr' -v 'attrval' file.xml
给定输入 XML
<?xml version="1.0"?>
<server-groups>
<server-group name="main-server-group" profile="full">
<jvm name="default">
<heap size="64m" max-size="512m"/>
<jvm-options>
<option value="somevalue"/>
</jvm-options>
</jvm>
<socket-binding-group ref="full-sockets"/>
</server-group>
</server-groups>
这导致输出
<?xml version="1.0"?>
<server-groups>
<server-group name="main-server-group" profile="full">
<jvm name="default">
<heap size="64m" max-size="512m"/>
<jvm-options>
<option value="somevalue"/>
</jvm-options>
</jvm>
<socket-binding-group ref="full-sockets"/>
<newtag newattr="attrval">tagval</newtag>
</server-group>
</server-groups>
请注意,XPath 表达式//server-group
将匹配全部 server_group
输入 XML 中的元素。如果您只想匹配name
属性为 的属性main-server-group
,则必须更改//server-group
为//server-group[@name="main-server-group"]
。
XMLStarlet 可从http://xmlstar.sourceforge.net/,但很可能已经有一个适用于您的 Unix 的预打包版本(使用它)。有时,只是调用 XMLStarlet 可执行文件xml
而不是xmlstarlet
.