Проблемы с добавлением атрибута в корневой узел XML через augeas

Я использую augeas для управления XML на некоторых машинах. В то время как создание новых узлов, а также установка множества атрибутов работали как шарм, я кусаю ногти, добавляя простой атрибут в файл XML. XML выглядит следующим образом:

<?xml version="1.0"?>
<Context>
   <WatchedResource></WatchedResource>
</Context>

Я не просто пытаюсь добавить allowLinking="true" в корневой узел контекста через

set /files/path/to/my/file.xml/Context/#attribute/allowLinking "true"

Который, к сожалению, всегда терпит неудачу с

/error = "put_failed"
/error/path = "/files/path/to/my/file.xml/Context"
/error/lens = "/usr/share/augeas/lenses/dist/xml.aug:134.10-.73:"
/error/message = "Failed to match \n    { /#attribute/ }?({ /#text/ …

Я использую марионетку с открытым исходным кодом 3.4.2 с augeas 1.0.0.

Любое предложение, что я делаю неправильно?


person daniel.eichten    schedule 22.01.2014    source источник


Ответы (1)


Порядок имеет значение в дереве Авгии. В этом случае атрибуты узла XML должны быть установлены перед узлом #text и дочерними узлами.

Итак, что вам нужно:

ins #attribute before /files/test.xml/Context/#text
set /files/test.xml/Context/#attribute/allowLinking true

Обратите внимание, что это изменение не является идемпотентным, поскольку insert не является идемпотентной операцией.

В Puppet вы можете использовать onlyif, чтобы сделать этот идемпотент.

person raphink    schedule 22.01.2014
comment
Спасибо! Работает как шарм. Теперь мне нужно позаботиться только о случаях, когда нет узла #text или уже существует #атрибут. ;-) - person daniel.eichten; 23.01.2014
comment
Конечно. В сложных случаях вы можете написать тип и провайдер на основе Augeas, используя AugeasProviders (см. augeasproviders.com). - person raphink; 23.01.2014