WIX 安装程序从 XmlConfig 元素中删除条目

时间:2021-03-04 16:31:56

标签: wix

如何使用 WIX XmlConfig 从此列表中删除“DrawListAddin”?

  <?xml version="1.0" encoding="utf-8"?>
  <ArrayOfString xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema- instance">
    <string>ExplorerAddin</string>
    <string>DrawListAddin</string>
    <string>MyDataAddin</string>
  </ArrayOfString>

结果应该是这样的

  <?xml version="1.0" encoding="utf-8"?>
  <ArrayOfString xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema- instance">
    <string>ExplorerAddin</string>
    <string>MyDataAddin</string>
  </ArrayOfString>

我尝试了多种设置但没有任何效果..最后一个版本看起来像这样。搜索正确的项目,然后将其删除。 XML 文件被修改但没有变化。

<util:XmlConfig Id='XmlSettingsRemove' 
    On="install"
    File='[E3D31_INSTALL_DIR]DesignAddins.xml' 
    Node='element'
    Action='delete'                         
    VerifyPath="//*[\[]text() [\[]contains(.,'DrawListAddin')[\]][\]]" 
    ElementPath="//ArrayOfString" 
    Sequence='1' 
 />

这段代码带来了一个错误信息,该节点无法找到,但最后的“/..”显式选择了正确的父节点

<util:XmlConfig Id='XmlSettingsRemove' 
  On="install"
  File='[E3D31_INSTALL_DIR]DesignAddins.xml' 
  Node='element'
  Action='delete'                       
  VerifyPath="/ArrayOfString/string[\[]text()[\[]contains(.,'DrawListAddin')[\]][\]]" 
  ElementPath="/ArrayOfString/string[\[]text()[\[]contains(.,'DrawListAddin')[\]][\]]/.." 
  Sequence='1' 
    />

1 个答案:

答案 0 :(得分:0)

仅供参考..这是带有嵌入式脚本的解决方案..我在代码中放入了一些占位符,例如“DO_SOME_HERE”..

    <CustomAction Id="UnInstallUIFileSetProperty" Property="UnInstallUIFileExec" Value="[PLACE_YOUR_PATH_TO_XML_FILE_HERE]" />  
    <CustomAction Id="UnInstallUIFileExec" Script="vbscript" Execute='deferred' Impersonate='no' Return='ignore'>
  <![CDATA[                     
                    on error resume next
                    c=Session.Property("CustomActionData")
                    n=c+"ADD_THE_XML_FILENAME_HERE"                                         
                    
                    Set x = CreateObject("Microsoft.XMLDOM")                                            
                    
                    x.async = False 
                    x.load(n)
                    
                    Set r = x.documentElement                       
                    Set l = r.getElementsByTagName("string")
                    For Each e In l                         
                        if InStr(e.text,"ENTER_SEARCHTEXT_HERE") then
                            e.ParentNode.removeChild(e)
                        end if
                    Next            
                    
                  if err.Number<>0 then
                    res=MsgBox("remove of addin failed: "+n)                        
                    else
                      x.Save(n)
                    end if
                
  ]]>
</CustomAction>