Используйте XMLStarlet, чтобы добавить 2 одинаковых подузла и значения XML - PullRequest
1 голос
/ 03 июня 2019

Я хочу использовать xmlstartlet в задаче Bash в DevOps Azure для редактирования приведенного ниже 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 и могу добавить один набор тегов Step и Name с помощью FC-SpikeArrest, но не могу добавить теги 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 Ответ

1 голос
/ 03 июня 2019

Вы можете сделать это в одной команде с помощью следующего:

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].Потому что в противном случае элемент значения добавляется к всем 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
...