Nant中的xmlpoke - 如何更新所有找到的字符串实例

5

你好,我在我的Nant构建脚本中使用Xpath来在开发和其他环境之间更改一些配置变量。

我从以下示例中获取了语法:

示例如下:

<xmlpoke
    file="config01/app.config"
    xpath="/configuration/appSettings/add[@key='AppName']/@value"
    value="TradeMonster">
</xmlpoke>

我希望有类似这样的功能,可以搜索我的连接字符串并找到所有“localhost\SqlExpress”的实例,然后将它们更改为“localhost”。请问这种操作是否可行?
2个回答

4
在这里快速编写一个简单的脚本……如果你确定每个文件中只有一个connectionstring元素,可以通过结合使用xmlpeek和xmlpoke来完成。使用一些C#更容易修改字符串,因此可以使用脚本任务进行正则表达式搜索和替换:
 <script language="C#" prefix="custom" >
      <code>
        <![CDATA[
          [Function("fix")]
          public static string Fix(string input) {
              return Regex.Replace(input, @"localhost\\\w+", "localhost");
          }
        ]]>
      </code>
  </script>

<!-- Get the existing connection string -->
<xmlpeek
    file="config01/app.config"
    xpath="/configuration/connectionStrings/add[@contains(@connectionString,'localhost\')]/@connectionString"
    property="connectionstring">
</xmlpeek>

<!-- Write back the modified connection string -->
<xmlpoke
    file="config01/app.config"
    xpath="/configuration/connectionStrings/add[@contains(@connectionString,'localhost\')]/@connectionString"
    value="${custom::fix(connectionstring)}">
</xmlpoke>

这真的很有帮助。 - Todd Smith

0

XPath 只能选择节点,不能更改节点

实现所需更改的一种方法是对 XML 文档执行 XSLT 转换。

为了实现这一点,您必须提供 XML 文档,并指定要更改哪些文本节点。


XPath仅选择节点,但xmlpoke(NAnt函数)更改由XPath选择的节点。 Xmlpoke是问题所在。 - azheglov
@azheglov: 这个问题被标记为“xpath”。即使短语“I am using XPath to change ...”是不正确的。OP想要XPath表达式“来搜索我的连接字符串”,但他没有提供要应用XPath表达式的XML文档,因此这是一个不完整的问题。这就是我在我的答案中表达的全部内容。 - Dimitre Novatchev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接