web-dev-qa-db-ja.com

xmlstarletを使用して新しい要素を作成する

新しい要素をXMLファイルに追加しようとしています。

元のファイル:

<levela>
  <levelb>
  </levelb>
</levela>

私は次の結果を得ようとしています:

<levela>
  <levelb>
    <levelc>
      <element1>value1</element1>
      <element2>value2</element2>
      <element3>value3</element3>
    </levelc>
  </levelb>
</levela>

私の現在の試みは:

xmlstarlet ed -a /levela/lelvelb -t elem -n levelc -v "" \
    -i //levelc -t elem -n "element1" -v "value1" \
    file.xml

しかし、私のファイルは更新されていません。

3
code_ninja

xmlstarletの呼び出しにタイプミスがあります(lelvelb):

xmlstarlet ed -a /levela/lelvelb -t elem -n levelc -v "" \
    -i //levelc -t elem -n "element1" -v "value1" \
    file.xml

サブノードを追加するには、-sまたは-aではなく、-i操作を使用する必要があります。

xmlstarlet ed -s /levela/levelb -t elem -n levelc -v "" \
    -s //levelc -t elem -n "element1" -v "value1" \
    file.xml

これは生成します

<?xml version="1.0"?>
<levela>
  <levelb>
  <levelc><element1>value1</element1><element2>value2</element2></levelc></levelb>
</levela>

必要に応じて、他の-s操作を追加できます。 levelcの空の-vを削除することもできます。

xmlstarletの標準出力で変換の結果を取得する代わりに、file.xml自体を変更する場合は、-Lオプションをedに追加します。

xmlstarlet ed -L -s /levela/levelb -t elem -n levelc -v "" \
    -s //levelc -t elem -n "element1" -v "value1" \
    file.xml
2
Stephen Kitt