2012-07-23 30 views
1

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> 

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

基本上,你需要一个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 
+0

谢谢!它非常完美!我真的很感激你的回复:)我在这里呆了一天。 – 2012-07-24 12:16:17