【发布时间】:2022-09-23 16:47:14
【问题描述】:
在 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>
如何使用 MSBuild 标准功能创建 version 元素并将其设置为 4.3.2.1(如果它不存在)或将其设置为 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>\" />
-
当
Condition=\"\'@(VersionEntry)\' == \'\'\"时,您应该在\'/manifest/metadata\' 上XmlPeek。正如文中所写编辑,<metadata><name>whatever</name></metadata>更改为<metadata><version>4.3.2.1</version></metadata>并且name丢失。
标签: msbuild msbuild-task