Добавление новых строк и вкладок в XML с помощью Augeas - PullRequest
1 голос
/ 06 августа 2020

Это связано с моим предыдущим сообщением об обновлении xml с помощью Augeas. Я вручную скорректировал формат и смог посмотреть, как новая строка и вкладки были добавлены и проанализированы в augtool. Я попытался добавить эти новые строки, но не смог вставить каждую строку # text между узлами items и дочерними узлами item . Можно ли добавить новые строки и вкладки, установив новую переменную для items / # text ?

Это что-то выполнимое с Augeas для вставки этих символов?

        <FileTypes>
        <items>
        <item value="video/*"/>
        <item value="audio/*"/>
        <item value="application/rar"/>
        </items>
        </FileTypes>      
/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[1] = "\n\t\t"
/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/#text[2] = "\t\t"
/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/#text[3] = "\t\t"
/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"

У меня есть что-то вроде этого ниже, чтобы вставить новую строку, но похоже, что это не работает, а только добавлены буквальные символы новой строки и табуляции.

set /files/opt/webapp/config.xml/File/FileTypes/items/#text \n\t\t'

И это приведет к в еще худшем состоянии.

        <FileTypes>
        <items>\n\t\t<item value="video/*"/>
<item value="audio/*"/>
<item value="application/rar"/>
</items>
        </FileTypes>      

1 Ответ

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

Я немного почесал в затылке, чтобы придумать элегантное идемпотентное решение, гарантирующее, что ваши <item> узлы имеют отступ с помощью одной таблицы. Вот предложение:

# define $audio (see previous question)
defnode audio item[#attribute/value="audio/*"] "#empty"

# define $noindent as $audio if the immediate previous node is not a `#text` one
defvar noindent $audio[preceding-sibling::*[1][label()!="#text"]]

# insert a #text element before $noindent. Will fail silently if $noindent doesn't match anything, making the change idempotent
ins #text before $noindent

# Set the value of the next #text node, which we are sure exists now
set #text[following-sibling::*[1][#attribute/value="audio/*"]] "\t"

Вообще говоря, #text работает нормально, и ваша проблема, скорее всего, заключалась в неправильном указании значения.

...