2

我有一个与此类似的 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

我期望它做的是用“另一个用户名”替换节点的全部内容,而不是它只是附加它导致:

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

如何使用 augeas 选择和更新 CDATA 元素的内容,或者在不删除实际节点本身的情况下将其删除?(真正的节点包含更多我不想硬编码的属性)

4

1 回答 1

3

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
于 2015-08-04T13:20:30.923 回答