在MSBuild目标中,我需要将XML元素的值设置为特定值。如果该元素不存在,我需要创建它。我试图使用MSBuild的XmlPoke任务来实现这一点,但是只有当元素已经存在时,它才能工作。下面是一个例子:
要更新的XML内容:
<?xml version="1.0" encoding="utf-8"?>
<manifest>
<metadata>
<name>whatever</name>
<version>1.2.3.4</version>
</metadata>
</manifest>使用如下所示的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>但是,如果输入缺少version元素,如下面所示,XmlPoke任务不会执行任何操作:
<?xml version="1.0" encoding="utf-8"?>
<manifest>
<metadata>
<name>whatever</name>
</metadata>
</manifest>如果version元素不存在,我如何创建它并将其设置为4.3.2.1;如果使用MSBuild标准功能,只需将其设置为4.3.2.1即可?
编辑:
将XmlPeek和XmlPoke结合在一起的公认答案是有效的。基于这个答案,下面是插入或更新值的代码:
<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>" />发布于 2022-09-15 18:50:40
XmlPoke使用指定的XPath ( Query )查找匹配的节点。如果它找到一个节点,它将用指定的InnerXml替换Value。每一场比赛它都会这样做。如果没有匹配,XmlPoke什么也不做。
使用标准MSBuild功能的方法:
使用XmlPeek测试/manifest/metadata/version。
如果存在version,则使用XmlPoke进行更新。
如果不存在version:
/manifest/metadata.
XmlPeek获取/manifest/metadata.
的内容,这是一个由metadata的现有内容组成的替换值,使用<version>$(ver)</version> appended.
XmlPoke来更新/manifest/metadata.如果这看起来很麻烦的话,你可以写一个内联的任务,上面写的版本。
https://stackoverflow.com/questions/73734665
复制相似问题