Создание новых элементов с помощью xmlstarlet

Создание новых элементов с помощью 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

Но мой файл не обновлен.

решение1

xmlstarletВ вашем призыве ( ) есть опечатка lelvelb:

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

Чтобы добавить подузел, необходимо использовать операцию -snot -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операции. Также можно убрать пустое -vдля levelc.

Если вы хотите изменить file.xmlсебя, вместо того, чтобы получать результат преобразования на xmlstarletстандартном выводе, добавьте -Lопцию ed:

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

Связанный контент