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

问题描述 投票:1回答:1

我试图在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>

请问你能帮帮我吗?

xml bash shell edit xmlstarlet
1个回答
2
投票

有了这个文件:

<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>
© www.soinside.com 2019 - 2024. All rights reserved.