Puppet Augeas - 无法更新包含 CDATA 的 xml 节点中的值

Puppet Augeas - cannot update value in xml node containing CDATA

我有一个与此类似的 xml 文档:

<?xml version="1.0" encoding="UTF-8"?>
<example>
    <member name="dbsettings">
        <node name="username"><![CDATA[someusername]]></node>
        <node name="password"><![CDATA[mypassword]]></node>
    </member>
    <member name="sitesettings">
        <node name="title"><![CDATA[just a title]]></node>
    </member>
</example>

我正在尝试使用以下 augeas 命令更新 puppet 中的这些设置:

set example/member[#attributes/name='dbsettings']/node[#attributes/name='username']/#text anotherusername

我期望它做的是将节点的全部内容替换为 "anotherusername" 而不是它只是附加它导致:

<node name="username"><![CDATA[someusername]]>anotherusername</node>

我如何select并使用 augeas 更新 CDATA 元素的内容或在不删除实际节点本身的情况下删除它? (真实节点包含更多我不想硬编码的属性)

Augtool 可以向您展示树的实际外观:

$ augtool -At "Xml incl /test.xml" -r .
augtool> set /augeas/context /files/test.xml
augtool> print example/member[#attribute/name='dbsettings']/node[#attribute/name='username']
/files/test.xml/example/member[1]/node[1]
/files/test.xml/example/member[1]/node[1]/#attribute
/files/test.xml/example/member[1]/node[1]/#attribute/name = "username"
/files/test.xml/example/member[1]/node[1]/#CDATA = "someusername"

这表明两件事:

  • 属性的语法是 #attribute,没有 's'
  • CDATA 存储在 #CDATA 子节点中

因此你的命令应该是:

set example/member[#attribute/name='dbsettings']/node[#attribute/name='username']/#CDATA anotherusername