我正在尝试自动添加新的子节点到nexus-core-feature-3.16.1-02.xml文件中。因为我们在工作中使用了一些插件,这些插件并没有随着“盒式”解决方案一起提供。
重点在于,当nexus-container发布新版本时,我有一个bash脚本来运行新的test-container版本,并将新的默认xml文件复制到适当的文件夹中。接下来的步骤是编辑这个文件,并添加一些新功能,使插件能够正常工作。完成后,旧容器停止,新的xml替换旧的文件,然后我启动一个带有映射nexus-data和默认xml的docker容器。
为了确保这个插件正常工作,我需要向默认xml文件中添加一些更改。我想使用xmlstarlet完成这个任务。
将以下内容添加到“nexus-core-feature”部分:
<feature version="1.0.9" prerequisite="false" dependency="false">nexus-repository-apt</feature>
</feature>
将此代码添加到xml文件的末尾
<feature name="nexus-repository-apt" description="net.staticsnow:nexus-repository-apt" version="1.0.10">
<details>net.staticsnow:nexus-repository-apt</details>
<bundle>mvn:net.staticsnow/nexus-repository-apt/1.0.10</bundle>
<bundle>mvn:org.apache.commons/commons-compress/1.18</bundle>
<bundle>mvn:org.tukaani/xz/1.8</bundle>
</feature>
</features>
我在谷歌和Stack Overflow上搜索了一段时间,但仍然卡住了。
例如这个案例:如何使用xmlstarlet在另一个元素下插入新元素?
看起来很容易做类似的事情,我尝试了这个:
xmlstarlet ed -s /features/feature/feature -t elem -n featureTMP -v "nexus-apt-repositroy" \
-i //featureTMP -t attr -n "version" -v "1.0.9" \
-i //featureTMP P -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
我怀疑我的错误在于节点路径。
接下来的步骤是检查节点。
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" nexus-core-feature-3.16.1-02-features.xml
使用属性选择器时,结果仍为空:
xmlstarlet sel -t -c "/features/feature[@name="nexus-core-feature"]" nexus-core-feature-3.16.1-02-features.xml
尝试在XPath在线测试器中检查,测试器内一切正常。接下来,在本文中使用了更简单的示例:https://unix.stackexchange.com/questions/386965/insert-custom-xml-tag-into-a-xml-file-in-a-bash-script,并尝试浏览文章中的示例文件,似乎没有问题。
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>
下一步
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>
我很困惑...为什么相同的方法无法处理nexus-xml文件?结构更加复杂/奇怪?欢迎任何建议。