在 XML 文件中取消标记嵌入在指定标记中的标记字符链的 xmlstarlet 命令是什么?
示例:搜索每个出现的 tag <b>
,只有在 tag 内才需要删除<c> ... </c>
:
- 输入示例:
<c>This is <b>an example</b>. <a>This is <b>a test;</b></a></c>
- 期望的输出:
<c>This is an example. <a>This is <b>a test;</b></a></c>
为了概括起见,我保留示例中的第二句话,即
<a>This is <b>a test;</b></a>
但如果这是一个问题,则可以忽略。
这可以通过
--update
将节点的值复制//c/b
到其父节点中--delete
来完成,然后删除现在不需要的b
节点。这类似于我在之前对您的问题的一个答案中采用的方法,在该方法中,我首先创建了一个内部
xmlstarlet
变量,该变量包含我们需要处理的所有节点的集合,然后再处理这些节点。我们这样做是为了更轻松地访问同一组节点以进行更新和删除操作。在上一个答案中,这是neccesary,但在这里它只是为了便于阅读。这里值得注意的是,更新的目标不是
b
节点的父节点,而是父节点的第一个文本值,text()[1]
。示例文档中节点父节点的第一个文本值//c/b
是字符串This is
。第二个文本值.
在b
节点之后。如果我们最后选择没有[1]
,我们最终会得到也就是说,该字符串
an example
将被插入到c
节点的两个文本值之后。现在,相反,我们得到