Xmlstarlet选择节点并添加子节点

Xmlstarlet选择节点并添加子节点,xml,xmlstarlet,Xml,Xmlstarlet,我正在尝试自动向nexus-core-feature-3.16.1-02.xml添加新的子节点,因为我们正在使用一些插件来完成“box”解决方案中没有的工作。 主要的一点是,当新版本的nexus容器发布时,我有一个bash脚本,它运行新的测试容器版本,并将新的默认xml文件复制到适当的文件夹中。 下一步是编辑此文件并添加一些新特性,以使插件正常工作。当这个旧容器停止运行时,新的xml将替换旧的容器,我将使用映射的nexus数据和默认xml启动一个docker容器。 为了使这个插件正常工作,我需要

我正在尝试自动向nexus-core-feature-3.16.1-02.xml添加新的子节点,因为我们正在使用一些插件来完成“box”解决方案中没有的工作。 主要的一点是,当新版本的nexus容器发布时,我有一个bash脚本,它运行新的测试容器版本,并将新的默认xml文件复制到适当的文件夹中。 下一步是编辑此文件并添加一些新特性,以使插件正常工作。当这个旧容器停止运行时,新的xml将替换旧的容器,我将使用映射的nexus数据和默认xml启动一个docker容器。 为了使这个插件正常工作,我需要对默认xml文件添加一些更改。我想用xmlstarlet来实现这一点。 将此添加到“nexus核心功能”部分:

我怀疑我的错误在节点路径中

下一步是检查节点

xmlstarlet sel-t-c”/“nexus-core-feature-3.16.1-02-features.xml

输出是整个xml文件,看起来不错

<features xmlns="http://karaf.apache.org/xmlns/features/v1.4.0" name="nexus-core-feature">
    <feature name="nexus-core-feature" description="org.sonatype.nexus.assemblies:nexus-core-feature" version="3.16.1.02">
        <details>org.sonatype.nexus.assemblies:nexus-core-feature</details>
        <feature version="3.16.1.02" prerequisite="false" dependency="false">nexus-audit-plugin</feature>
        <feature version="3.16.1.02" prerequisite="false" dependency="false">nexus-blobstore-tasks</feature>
        <feature version="3.16.1.02" prerequisite="false" dependency="false">nexus-ssl-plugin</feature>
        <feature version="3.16.1.02" prerequisite="false" dependency="false">nexus-coreui-plugin</feature>
        <feature version="3.16.1.02" prerequisite="false" dependency="false">nexus-repository-httpbridge</feature>
...
使用属性选择器时,它仍然为空:

xmlstarlet sel -t -c "/features/feature[@name="nexus-core-feature"]" nexus-core-feature-3.16.1-02-features.xml
尝试在XPath在线测试仪和测试仪内部检查这一切正常

接下来,我将在本文中使用更简单的示例:

并尝试浏览arctilce中的示例文件,结果似乎不错

xmlstarlet sel -t -c "/server-groups" file.xml
输出:

<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>
<jvm name="default">
      <heap size="64m" max-size="512m"/>
      <jvm-options>
        <option value="somevalue"/>
      </jvm-options>
    </jvm>
输出:

<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>
<jvm name="default">
      <heap size="64m" max-size="512m"/>
      <jvm-options>
        <option value="somevalue"/>
      </jvm-options>
    </jvm>

这让我很困惑。。。为什么相同的方法不适用于NexusXML文件?更复杂\奇怪的结构?我很乐意接受任何建议

为什么相同的方法不适用于NexusXML文件

这是因为您的NexusXML文件位于默认名称空间(
http://karaf.apache.org/xmlns/features/v1.4.0

如果您使用的是xmlstarlet版本1.0.5或更高版本,那么可以在XPath中使用
\:
来匹配任何名称空间。否则,必须将名称空间绑定到前缀
-N
。更多信息

以下是您第一次尝试的更新示例:

xmlstarlet ed-s/\:features/\:feature-t elem-n featureTMP-v“nexus存储库apt”\
-i//featureTMP-t attr-n“版本”-v“1.0.9”\
-i//featureTMP-t attr-n“先决条件”-v“假”\
-i//featureTMP-t attr-n“依赖项”-v“false”\
-r//featureTMP-v feature nexus-core-feature-3.16.1-02-features.xml
下面是使用
-N

xmlstarlet ed -N f="http://karaf.apache.org/xmlns/features/v1.4.0" -s /f:features/f:feature -t elem -n featureTMP -v "nexus-repository-apt" \
    -i //featureTMP -t attr -n "version" -v "1.0.9" \
    -i //featureTMP -t attr -n "prerequisite" -v "false" \
    -i //featureTMP -t attr -n "dependency" -v "false" \
    -r //featureTMP -v feature nexus-core-feature-3.16.1-02-features.xml    
这两者都产生以下输出:


程序集:nexus核心特性
nexus审计插件
nexus blobstore任务
NexusSSL插件
NexusCoreUI插件
nexus存储库httpbridge
nexus存储库apt
添加第二个
功能
也可以用同样的方法完成,但也可以通过在xmlstarlet中使用XSLT来简化整个过程。(无论如何,我认为这更简单。)

XSLT(test.xsl)


staticsnow:nexus存储库apt
mvn:net.staticsnow/nexus-repository-apt/1.0.10
mvn:org.apache.commons/commons-compress/1.18
mvn:org.tukaani/xz/1.8
nexus存储库apt
xmlstarlet命令

xmlstarlet tr test.xsl nexus-core-feature-3.16.1-02-features.xml
输出


程序集:nexus核心特性
nexus审计插件
nexus blobstore任务
NexusSSL插件
NexusCoreUI插件
nexus存储库httpbridge
nexus存储库apt
staticsnow:nexus存储库apt
mvn:net.staticsnow/nexus-repository-apt/1.0.10
mvn:org.apache.commons/commons-compress/1.18
mvn:org.tukaani/xz/1.8

谢谢你的盛情款待,丹尼尔!这对我来说似乎是可行的解决方案,但仍需要为我的案例做一些修改:)@Афаааааааааааааа!
xmlstarlet sel -t -c "/server-groups/server-group/jvm" file.xml
<jvm name="default">
      <heap size="64m" max-size="512m"/>
      <jvm-options>
        <option value="somevalue"/>
      </jvm-options>
    </jvm>
xmlstarlet ed -N f="http://karaf.apache.org/xmlns/features/v1.4.0" -s /f:features/f:feature -t elem -n featureTMP -v "nexus-repository-apt" \
    -i //featureTMP -t attr -n "version" -v "1.0.9" \
    -i //featureTMP -t attr -n "prerequisite" -v "false" \
    -i //featureTMP -t attr -n "dependency" -v "false" \
    -r //featureTMP -v feature nexus-core-feature-3.16.1-02-features.xml