2

私は次のコマンドを使用しています:

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

ただし、その1つにさらに2つのタグを挿入したいと思います。

<app>
 <name>name</name>
 <nikname>nikname</nikname>
</app>

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

これを作成したということです。:

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

正確なコマンドを知っていますか?

このコマンドを試しましたが、すべてのアプリタグに複製されました

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
4

1 に答える 1

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
于 2012-07-24T01:01:04.467 に答える