【问题标题】:Puppet Augeas - cannot update value in xml node containing CDATAPuppet Augeas - 无法更新包含 CDATA 的 xml 节点中的值
【发布时间】:2015-10-26 21:21:50
【问题描述】:

我有一个类似这样的 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 元素的内容,或者在不删除实际节点本身的情况下将其删除? (真正的节点包含更多我不想硬编码的属性)

【问题讨论】:

    标签: xml puppet augeas


    【解决方案1】:

    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
    

    【讨论】:

    • 非常感谢!我在任何地方都找不到有关 #CDATA 子节点的信息,而且 augtool 没有为我显示树
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-22
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多