如何在MSBuild中使用XmlPoke创建或更新XML元素值
在MSBuild中实现XML元素的存在则更新、不存在则创建
我需要在MSBuild目标里实现:将指定XML元素的值设为目标值,如果元素不存在则创建它。尝试用XmlPoke任务,但它只对已存在的元素生效。
待更新的初始XML
<?xml version="1.0" encoding="utf-8"?> <manifest> <metadata> <name>whatever</name> <version>1.2.3.4</version> </metadata> </manifest>
XmlPoke对已存在元素的生效情况
使用以下XmlPoke任务可以成功修改version元素的值:
<XmlPoke XmlInputPath="$(XmlFilePath)" Query="/manifest/metadata/version" Value="4.3.2.1" />
执行后的结果:
<?xml version="1.0" encoding="utf-8"?> <manifest> <metadata> <name>whatever</name> <version>4.3.2.1</version> </metadata> </manifest>
问题:元素不存在时XmlPoke无操作
如果输入XML中缺少version元素,XmlPoke不会执行任何操作:
<?xml version="1.0" encoding="utf-8"?> <manifest> <metadata> <name>whatever</name> </metadata> </manifest>
解决方案:结合XmlPeek与XmlPoke实现需求
通过XmlPeek先检查目标元素是否存在,再根据检查结果选择执行更新或创建操作,具体代码如下:
<XmlPeek XmlInputPath="$(XmlFilePath)" Query="/manifest/metadata/version"> <Output TaskParameter="Result" ItemName="VersionEntry" /> </XmlPeek> <XmlPoke Condition="'@(VersionEntry)' != ''" XmlInputPath="$(XmlFilePath)" Query="/manifest/metadata/version" Value="4.3.2.1" /> <XmlPoke Condition="'@(VersionEntry)' == ''" XmlInputPath="$(XmlFilePath)" Query="/manifest/metadata" Value="<Name>whatever</Name><Version>4.3.2.1</Version>" />
内容的提问来源于stack exchange,提问作者ackh
相关产品推荐
相关产品推荐

