Добавление новых узлов в файл XML с помощью Augeas

У меня есть этот XML-файл /opt/webapp/config.xml для настраиваемого веб- приложения, содержащего элементы родительского узла.

<items>
</items>

Я пытаюсь добавить список новых элементов дочерних узлов со значением атрибута, при этом убеждаюсь, что дочерний узел не содержит закрывающий / закрывающий тег, поскольку приложению требуется этот формат.

<items>
<item value="video/*"/><item value="audio/*"/><item value="application/rar"/><item value="application/x-zip"/><item value="application/x-gzip"/>
</items>

Если бы мне пришлось открыть существующую конфигурацию с помощью augtool, я бы получил следующий результат.

/files/opt/webapp/config.xml/File/FileTypes
/files/opt/webapp/config.xml/File/FileTypes/#text = "\n"
/files/opt/webapp/config.xml/File/FileTypes/items
/files/opt/webapp/config.xml/File/FileTypes/items/#text = "\n"
/files/opt/webapp/config.xml/File/FileTypes/items/item[1] = "#empty"
/files/opt/webapp/config.xml/File/FileTypes/items/item[1]/#attribute
/files/opt/webapp/config.xml/File/FileTypes/items/item[1]/#attribute/value = "video/*"
/files/opt/webapp/config.xml/File/FileTypes/items/item[2] = "#empty"
/files/opt/webapp/config.xml/File/FileTypes/items/item[2]/#attribute
/files/opt/webapp/config.xml/File/FileTypes/items/item[2]/#attribute/value = "audio/*"
/files/opt/webapp/config.xml/File/FileTypes/items/item[3] = "#empty"
/files/opt/webapp/config.xml/File/FileTypes/items/item[3]/#attribute
/files/opt/webapp/config.xml/File/FileTypes/items/item[3]/#attribute/value = "application/rar"

Я нашел несколько сообщений здесь и здесь, в которых обсуждаются xml и Augeas, но эти примеры соответствуют формату как с начальным, так и с закрывающим тегом. Например:<item value="application/rar"></item> . И я пытаюсь найти способ узнать, может ли Augeas также создавать и добавлять дочерний узел только с самозакрывающимся тегом.

Я использую augtool (версия 1.10.1), который поставляется с марионеточным агентом 5.5.10 на RHEL 7.

Спасибо.

# augeas
Источник
Codelisting
за 1 против
Лучший ответ

Как вы можете видеть в своем примере, самозакрывающиеся теги имеют значение#empty , поэтому вам просто нужно установить это значение для своих элементов.

Итак, в вашем случае вы можете сделать что-то вроде:

# set context to use relative paths later
set /augeas/context /files/opt/webapp/config.xml/File/FileTypes/items

# define a $video variable pointing to the video element, define it as self-closing
defnode video item[#attribute/value="video/*"] "#empty"
# Set element value
set $video/#attribute/value "video/*"

defnode audio item[#attribute/value="audio/*"] "#empty"
set $audio/#attribute/value "audio/*"

defnode rar item[#attribute/value="application/rar"] "#empty"
set $rar/#attribute/value "application/rar"

и т.п.

в результате чего:

<items>
<item value="video/*"/>
<item value="audio/*"/>
<item value="application/rar"/>
</items>

defnode определит переменную, указывающую на узел, и установит ее значение, если оно еще не существует. В результате этот код будет идемпотентным.

  • 1
    Спасибо. Это работает именно так, как я задумал. Также только что выяснилось, что Augeas позаботится о добавлении и изменении конфигураций, но не будет обрабатывать отступы и форматирование. Думаю, это придется делать отдельно.
  • 0
    Да, Авгий охотно игнорирует форматирование. Для этого вам понадобится средство форматирования / украшения, если оно вам небезразлично.
Codelisting
Популярные категории
На заметку программисту