Добавление новых узлов в файл XML с помощью Augeas - PullRequest
1 голос
/ 05 августа 2020

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

<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.

Спасибо.

1 Ответ

1 голос
/ 05 августа 2020

Как вы можете видеть в своем примере, самозакрывающиеся теги имеют значение #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"

et c.

в результате:

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

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

...