xmlstarlet:如何有条件地添加缺失元素(upsert)

时间:2014-01-31 20:50:10

标签: xmlstarlet

使用XMLStarlet,我想在列表中添加另一个属性,

<document>
   <properties>
       <property>...</property>
       <property>...</property>  <!-- add this! -->
   </properties>
</document>

这很容易,除了“properties”标签是可选的并且可能在原始文档中缺失,在这种情况下,需要有条件地创建“properties”标签。

3 个答案:

答案 0 :(得分:1)

ed子命令没有任何条件,所以没有好办法,但我认为你可以插入一个新的properties元素然后删除它,如果结果是“额外的” (即不是第一个):

xmlstarlet ed \
  -s /document -t elem -n properties -v '' \
  -d '/document/properties[position() != 1]' \
  -s /document/properties -t elem -n property -v 'new property value' \
  doc.xml

否则,您可以先使用sel进行检查,然后使用shell条件来决定是否需要插入。

答案 1 :(得分:1)

在Windows Batch中,您可以执行SEL,然后检查%errorlevel% 0意味着它被发现了 1表示未找到

示例:

xmlstarlet.exe -q sel -t -c "/config/option[@name='product']" xml.cfg
if %errorlevel%==1 (
    xmlstarlet.exe ed -L -s "/config/" -t elem -n "option" -v "" -i "/config/option[last()]" -t attr -n "name" -v "product" xml.cfg
)

答案 2 :(得分:0)

以下是我在批处理中使用的内容,您将需要sed:

rem var may be set by following command
Set NodeCount=

rem count how many nodes, pipe to sed to put in the SET
xml sel -T -t -v "count(/document/properties)" -n doc.xml|sed "s/^/Set NodeCount=/" >tmp2.bat

Call tmp2.bat
Delete tmp2.bat

if "%NodeCount%"=="0" Goto NoNodes

rem Do Insert Node Here

Goto :eof

:NoNodes

rem handle no nodes Here

如果你找到一个更好的方式,我全都耳朵。