代码之家  ›  专栏  ›  技术社区  ›  David Rodriguez Lores

如何使用xmlstarlet向xmlfile的每个节点添加不同的属性

  •  1
  • David Rodriguez Lores  · 技术社区  · 7 年前

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

    使用此方法,我在$文件中得到以下结果:

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

    但我正在努力实现的目标如下:

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

    你能帮帮我吗?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Cyrus    7 年前

    使用此文件:

    <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>