如何使用 xmlstarlet 为 xml 文件的每个节点添加不同的属性

Posted

技术标签:

【中文标题】如何使用 xmlstarlet 为 xml 文件的每个节点添加不同的属性【英文标题】:How to add diferent attributes to each node of an xmlfile using xmlstarlet 【发布时间】:2018-06-12 04:14:24 【问题描述】:

我试图在 bash 脚本中使用 xmlstarlet 编辑 xml 文件。 但是我发现在尝试为相同节点中的相同属性赋予不同值时遇到问题,让我用这个例子来告诉你: 使用此代码

xmlstarlet ed -L -s /foo -t elem -n bar -v "" -i //bar -t attr -n id -v bar1 $file  
xmlstarlet ed -L -s /foo -t elem -n bar -v "" -i //bar -t attr -n id -v bar2 $file

使用这个我在 $file 中得到以下结果:

<foo>
  <bar id="bar1" id="bar2"/>
  <bar id="bar2"/>
</foo>

但我想要达到的效果是这样的:

<foo>
  <bar id="bar1"/>
  <bar id="bar2"/>
</foo>

你能帮帮我吗?

【问题讨论】:

将 $file 的内容添加到您的问题中。 首先,谢谢你的回答 Cyrus,现在我正在尝试将它应用到我的项目中,其次 $file 的内容只是一行,在这种情况下将是 【参考方案1】:

有了这个文件:

<foo>
</foo>

命令:

xmlstarlet edit --omit-decl \
   --subnode "//foo" --type elem -n "bar" \
   --insert "//bar[1]" --type attr -n "id" --value "bar1" \
   --subnode "//foo" --type elem -n "bar" \
   --insert "//bar[2]" --type attr -n "id" --value "bar2" file.xml 

如果您不想计算新元素,请使用last()

xmlstarlet edit --omit-decl \
   --subnode "//foo" --type elem -n "bar" \
   --insert "//bar[last()]" --type attr -n "id" --value "bar1" \
   --subnode "//foo" --type elem -n "bar" \
   --insert "//bar[last()]" --type attr -n "id" --value "bar2" file.xml

两种情况下的输出:

<foo>
  <bar id="bar1"/>
  <bar id="bar2"/>
</foo>

【讨论】:

以上是关于如何使用 xmlstarlet 为 xml 文件的每个节点添加不同的属性的主要内容,如果未能解决你的问题,请参考以下文章

xmlstarlet 通过属性而不是元素匹配/解析

在 plist 文件中如何通过 xmlstarlet 工具在唯一键标记后提取字符串文本

如何使用 xmlstarlet 在另一个元素下插入新元素?

使用 xmlstarlet 或 xmllint 获取属性值

bash,xmlstarlet提取两个节点

xmlstarlet不能用于基于子字符串值的简单选择[重复]