使用 XMLStarlet 添加 2 个相似的 XML 子节点和值

Use XMLStarlet to add 2 similar XML subnodes and values

我想在 Azure DevOps 的 Bash 任务中使用 xmlstartlet 来编辑以下 XML。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ProxyEndpoint name="default">
    <PostFlow name="PostFlow">
        <Request/>
        <Response/>
    </PostFlow>

我想把这段代码改成下面的样子。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ProxyEndpoint name="default">
    <PostFlow name="PostFlow">
        <Request>
            <Step>
                <Name>FC-SpikeArrest</Name>
            </Step>
            <Step>
                <Name>FC-JWT</Name>
            </Step>
        </Request>
        <Response/>
    </PostFlow>

我使用了下面的 XML 命令,我可以使用 FC-SpikeArrest 添加一组 Step 和 Name 标签,但无法添加 FC-JWT 标签。

xmlstarlet edit --omit-decl \
-s '/ProxyEndpoint/PostFlow/Request' -t elem -n "Step" \
-s '/ProxyEndpoint/PostFlow/Request/Step' -t elem -n "Name" -v "FC-SpikeArrest" ./default.xml >temp.xml

这里有什么问题?

xmlstarlet edit --omit-decl \
-s '/ProxyEndpoint/PostFlow/Request' -t elem -n "Step" \
-s '/ProxyEndpoint/PostFlow/Request/Step' -t elem -n "Name" -v "FC-SpikeArrest" ./default.xml >temp.xml
mv temp.xml default1.xml

xmlstarlet edit --omit-decl \
-s '/ProxyEndpoint/PostFlow/Request' -t elem -n "Step" \
-s '/ProxyEndpoint/PostFlow/Request/Step' -t elem -n "Name" -v "FC-JWT"./default1.xml >temp1.xml
mv temp1.xml default.xml

您可以使用以下命令在一个命令中完成此操作:

xmlstarlet edit --omit-decl \
-s '/ProxyEndpoint/PostFlow/Request' -t elem -n "Step" \
-s '/ProxyEndpoint/PostFlow/Request/Step' -t elem -n "Name" -v "FC-SpikeArrest" \
-s '/ProxyEndpoint/PostFlow/Request' -t elem -n "Step" \
-s '/ProxyEndpoint/PostFlow/Request/Step[2]' -t elem -n "Name" -v "FC-JWT" ./default.xml > temp.xml

如果您想像以前一样使用两个步骤,您仍然需要使用 [2] 索引 Step 元素。因为否则 value 元素将添加到 all Step 元素。

(您还遗漏了 -v "FC-JWT"./default1.xml 之间的关键 space)

所以第二个命令应该是这样的:

xmlstarlet edit --omit-decl \
-s '/ProxyEndpoint/PostFlow/Request' -t elem -n "Step" \
-s '/ProxyEndpoint/PostFlow/Request/Step[2]' -t elem -n "Name" -v "FC-JWT" ./default1.xml >temp1.xml