使用 Augeas 将新节点添加到 XML 文件

Adding new nodes to XML file with Augeas

我有这个 XML 文件 /opt/webapp/config.xml 用于包含父节点 items 的自定义 Web 应用程序.

<items>
</items>

我正在尝试添加具有属性 value 的新子节点列表 item,同时确保子节点不存在'不包含 end/closing 标签,因为该应用需要该格式。

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

我发现一些帖子 here and here 讨论了 xml 和 Augeas,但这些示例遵循带有开始和结束标记的格式。例如:<item value="application/rar"></item>。我正在尝试找到一种方法来查看 Augeas 是否也可以创建和添加仅具有自关闭标记的子节点。

我在 RHEL 7 上使用 puppet 代理 5.5.10 附带的 augtool(版本 1.10.1)。

谢谢。

如您在示例中所见,self-closing 标签的值为 #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 将定义一个指向节点的变量,如果它不存在则设置它的值。因此,这段代码将是幂等的。