xmlstarlet插入标签

Fel*_*ipe 2 xmlstarlet

我正在使用命令:

xmlstarlet ed --omit-decl --subnode "/boinc" --type elem -n app -v "" project_00.xml > project_01.xml

但是,我想在这一个中再插入两个标签:

<app>
 <name>name</name>
 <nikname>nikname</nikname>
</app>
Run Code Online (Sandbox Code Playgroud)

在我project_00.xml,我已经有其他标签应用程序,它导致冲突.

此命令的问题:

xmlstarlet ed --subnode "/boinc" --type elem -n app -v "" project_00.xml|     xmlstarlet ed --subnode //app --type elem -n name -v "newApp"| xmlstarlet ed --subnode //app --type elem -n user_friendly_name -v "New.App" > project_01.xml
Run Code Online (Sandbox Code Playgroud)

就是它创造了这个:

  <app name="wilson">
    <name>wilson</name>
    <user_friendly_name>Mr.Wilson</user_friendly_name>
    <name>newApp</name>
    <user_friendly_name>New.App</user_friendly_name>
  </app>
  <app>
    <name>newApp</name>
    <user_friendly_name>New.App</user_friendly_name>
  </app>
Run Code Online (Sandbox Code Playgroud)

知道确切的命令吗?

我尝试了这个命令,但它复制了所有应用程序标签

xmlstarlet ed -s "/boinc" -t elem -n app -v "" -s "/boinc/app" -t elem -n name -v "name" -s "/boinc/app" -t elem -n user_friendly_name -v "New.App" project_00.xml > project_01.xml
Run Code Online (Sandbox Code Playgroud)

npo*_*avs 5

基本上,您需要一个XPath表达式来匹配刚刚插入的节点; 因为--subnode总是把新孩子放在最后的位置你可以使用/boinc/app[last()]:

xmlstarlet ed \
  --subnode /boinc --type elem -n app -v '' \
  --subnode '/boinc/app[last()]' --type elem -n name -v newApp \
  --subnode '/boinc/app[last()]' --type elem -n user_friendly_name -v New.App \
  project_00.xml > project_01.xml
Run Code Online (Sandbox Code Playgroud)