【问题标题】:How to create or update the value of an element using XmlPoke如何使用 XmlPoke 创建或更新元素的值
【发布时间】: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(如果它确实存在)?


编辑:

结合XmlPeekXmlPoke 的公认答案有效。基于该答案,这里是插入或更新值的代码:

<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=\"&lt;Name&gt;whatever&lt;/Name&gt;&lt;Version&gt;4.3.2.1&lt;/Version&gt;\" />
  • Condition=\"\'@(VersionEntry)\' == \'\'\" 时,您应该在\'/manifest/metadata\' 上XmlPeek。正如文中所写编辑, &lt;metadata&gt;&lt;name&gt;whatever&lt;/name&gt;&lt;/metadata&gt; 更改为 &lt;metadata&gt;&lt;version&gt;4.3.2.1&lt;/version&gt;&lt;/metadata&gt; 并且 name 丢失。

标签: msbuild msbuild-task


【解决方案1】:

XmlPoke 使用指定的 XPath,Query,来查找匹配节点。如果它找到一个节点,它会将InnerXml 替换为指定的Value。它将为每场比赛执行此操作。如果没有匹配项,XmlPoke 什么也不做。

使用标准 MSBuild 功能的方法:

使用XmlPeek 测试/manifest/metadata/version

如果version 存在,则使用XmlPoke 进行更新。

如果version 不存在:

  1. 使用XmlPeek获取/manifest/metadata的内容。
  2. 创建一个替换值,其中包含metadata 的现有内容并附加&lt;version&gt;$(ver)&lt;/version&gt;
  3. 使用XmlPoke 更新/manifest/metadata

    如果这看起来很麻烦,您可以编写一个“更新”版本的内联任务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    相关资源
    最近更新 更多