如何使用xmlstarlet向xml文件的每个节点添加不同的属性
How to add diferent attributes to each node of an xmlfile using xmlstarlet
我试图在 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>
你能帮帮我吗?
使用此文件:
<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>
我试图在 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>
你能帮帮我吗?
使用此文件:
<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>