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

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

<items>
</items>

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

<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), который поставляется с агентом puppet 5.5.10 на RHEL 7.

Спасибо.


person user2816863    schedule 05.08.2020    source источник


Ответы (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 определит переменную, указывающую на узел, и установит ее значение, если она еще не существует. В результате этот код будет идемпотентным.

person raphink    schedule 05.08.2020
comment
Спасибо. Это работает именно так, как я задумал. Также только что узнал, что Augeas позаботится о добавлении и изменении конфигураций, но не будет обрабатывать отступы и форматирование. Думаю, это придется делать отдельно. - person user2816863; 05.08.2020
comment
Да, Авгий охотно игнорирует форматирование. Вам нужно будет использовать форматтер/улучшитель для этого, если вы заботитесь об этом. - person raphink; 06.08.2020