使用WIX 3.5安装我的文件后,我想更改一个xml文件中的某些值。
目前有多个条目如下:
<endpoint address="net.tcp://localhost/XYZ" .../>
我想将localhost更改为由于属性而可用的真实服务器名称。如何在此xml文件中的每个条目上执行此替换?有没有办法在不编写自己的CA的情况下执行此操作?
提前致谢!
答案 0 :(得分:4)
UPDATE :根据以下评论,事实证明只应更改属性(或元素)值的一部分。这似乎不受两个引用元素中的任何一个支持。
我会采用以下两种方法之一:
这比创建自己的更好,因为在这种情况下你可以依赖更深层次的测试
假设您将`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_ReadFile
和Win32_WriteFile
个自定义操作。
但是,编写完整的自定义操作可能会更容易,该操作将加载XML配置文件,执行替换并将文件写回磁盘。为此,您可以使用XSLT和JScript(请参阅an example code)。