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

时间:2019-06-03 10:00:04

标签: xml bash xmlstarlet

我想在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

1 个答案:

答案 0 :(得分:1)

您可以在一个命令中执行以下操作:

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

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

(您还缺少-v "FC-JWT"./default1.xml之间的关键空格)

因此第二个命令应如下所示:

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