使用 Augeas 在 XML 中添加新行和制表符
Adding new lines and tabs in XML using Augeas
这与我之前 使用 Augeas 更新 xml 有关。我手动调整了格式,并能够查看新行和选项卡是如何在 augtool 中添加和解析的。我尝试添加这些新行,但无法在 items 节点和子节点 item[ 之间插入每个 #text 行=28=] 个节点。是否可以通过为 items/#text 设置新变量来添加新行和制表符?
Augeas 可以插入这些字符吗?
<FileTypes>
<items>
<item value="video/*"/>
<item value="audio/*"/>
<item value="application/rar"/>
</items>
</FileTypes>
/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[1] = "\n\t\t"
/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/#text[2] = "\t\t"
/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/#text[3] = "\t\t"
/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"
我在下面有类似这样的东西来插入一个新行,但它似乎没有用,只添加了一个字面的新行和制表符。
set /files/opt/webapp/config.xml/File/FileTypes/items/#text \n\t\t'
这会导致更糟糕的情况。
<FileTypes>
<items>\n\t\t<item value="video/*"/>
<item value="audio/*"/>
<item value="application/rar"/>
</items>
</FileTypes>
我绞尽脑汁想出一个优雅、幂等的解决方案来确保您的 <item>
节点按一个表格缩进。这里有一个建议:
# define $audio (see previous question)
defnode audio item[#attribute/value="audio/*"] "#empty"
# define $noindent as $audio if the immediate previous node is not a `#text` one
defvar noindent $audio[preceding-sibling::*[1][label()!="#text"]]
# insert a #text element before $noindent. Will fail silently if $noindent doesn't match anything, making the change idempotent
ins #text before $noindent
# Set the value of the next #text node, which we are sure exists now
set #text[following-sibling::*[1][#attribute/value="audio/*"]] "\t"
一般来说,#text
工作正常,您的问题很可能是对值的错误引用。
这与我之前
Augeas 可以插入这些字符吗?
<FileTypes>
<items>
<item value="video/*"/>
<item value="audio/*"/>
<item value="application/rar"/>
</items>
</FileTypes>
/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[1] = "\n\t\t"
/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/#text[2] = "\t\t"
/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/#text[3] = "\t\t"
/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"
我在下面有类似这样的东西来插入一个新行,但它似乎没有用,只添加了一个字面的新行和制表符。
set /files/opt/webapp/config.xml/File/FileTypes/items/#text \n\t\t'
这会导致更糟糕的情况。
<FileTypes>
<items>\n\t\t<item value="video/*"/>
<item value="audio/*"/>
<item value="application/rar"/>
</items>
</FileTypes>
我绞尽脑汁想出一个优雅、幂等的解决方案来确保您的 <item>
节点按一个表格缩进。这里有一个建议:
# define $audio (see previous question)
defnode audio item[#attribute/value="audio/*"] "#empty"
# define $noindent as $audio if the immediate previous node is not a `#text` one
defvar noindent $audio[preceding-sibling::*[1][label()!="#text"]]
# insert a #text element before $noindent. Will fail silently if $noindent doesn't match anything, making the change idempotent
ins #text before $noindent
# Set the value of the next #text node, which we are sure exists now
set #text[following-sibling::*[1][#attribute/value="audio/*"]] "\t"
一般来说,#text
工作正常,您的问题很可能是对值的错误引用。