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