将自定义 XML 标签插入到 bash 脚本中的 XML 文件中

将自定义 XML 标签插入到 bash 脚本中的 XML 文件中

我正在尝试使用 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,您可以向元素添加子节点,也可以更新现有元素。为了涵盖元素存在和不存在的情况,我们可以

  1. 删除该元素。
  2. 添加具有我们希望其具有的值的元素。

假设我们要添加的元素是<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.

相关内容