如何在安装WIX后对XML文件执行搜索和替换?

时间:2011-03-28 09:07:06

标签: string installer wix wix3.5

使用WIX 3.5安装我的文件后,我想更改一个xml文件中的某些值。

目前有多个条目如下:

<endpoint address="net.tcp://localhost/XYZ" .../>

我想将localhost更改为由于属性而可用的真实服务器名称。如何在此xml文件中的每个条目上执行此替换?有没有办法在不编写自己的CA的情况下执行此操作?

提前致谢!

4 个答案:

答案 0 :(得分:4)

XmlConfig和/或XmlFile元素是您的朋友。

UPDATE :根据以下评论,事实证明只应更改属性(或元素)值的一部分。这似乎不受两个引用元素中的任何一个支持。

我会采用以下两种方法之一:

  • 使用第三方“读取XML”操作,例如this one
   

这比创建自己的更好,因为在这种情况下你可以依赖更深层次的测试

  • 教您的构建脚本以控制字符串模式
   

假设您将`net.tcp:// localhost / XYZ`放到构建文件中,并指出您的代码将此值作为字符串模式在安装时使用。例如,将字符串模式保留为MSI包中的Property。当它改变时,例如到`net.tcp:// localhost / ABC`你将不得不在你的行动中改变任何东西。在这种情况下,从XMLFile透视图中,您始终知道FROM和TO属性值。

答案 1 :(得分:0)

InstallShield有一个内置的数据驱动自定义操作,称为文本搜索。它基本上允许像您所描述的那样进行RegEx样式替换。

WiX没有此功能,但您可以编写自定义操作(例如使用C#/ DTF)来为您执行此操作。

答案 2 :(得分:0)

在Wix中没有任何内容,您可以在不使用自定义操作的情况下更改文件中的内容。如果您不想使用CA,可以考虑在其他地方保存设置,例如用户的注册表并始终从那里读取该设置

答案 3 :(得分:0)

如果您的XML配置文件不大,您可以将文件加载到内存中并使用JScript执行替换。

var s = "<endpoint address=\"net.tcp://localhost/XYZ\" .../>";

var re = /"net.tcp:\/\/localhost\//g;
var r = s.replace(re, "\"http://newhost.com/");

此处s是您的完整XML文件,re是正则表达式,r将包含结果或替换。

您可以使用JScript读取和写入Windows Installer的公共属性。然而,还有一个问题:您必须读取XML文件并将其写回磁盘。为此,您可以使用AppSecInc. MSI Extensions中Yan引用的his answer库中的Win32_ReadFileWin32_WriteFile个自定义操作。


但是,编写完整的自定义操作可能会更容易,该操作将加载XML配置文件,执行替换并将文件写回磁盘。为此,您可以使用XSLT和JScript(请参阅an example code)。