使用 Inno Setup 更改配置标签中包含命名空间的 web.config

问题描述 投票:0回答:1

我想为使用 Inno Setup 创建的安装包的 web.config 文件中的节点设置新属性。 要设置此属性,我使用过程 SaveAttributeValueToXML

我的 web.config 文件以带有命名空间的配置部分开头。我正在尝试向标签添加一个属性

web.config 文件结构如下所示:

<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0"> 
  <system.web.extensions>
    <scripting>
      <webServices>
        <authenticationService enabled="true"/>
        <roleService enabled="true"/>
      </webServices>
    </scripting>
  </system.web.extensions>
</configuration>

我想向authenticationService 添加一个新属性,如下所示:

   <authenticationService enabled="true" requireSSL = "true"/>

当我调用 SaveAttributeValueToXML 时

SaveAttributeValueToXML(ConfigFileName, '/configuration/system.web.extensions/scripting/webServices/authenticationService', 'requireSSL', 'True');

由于配置标记中的命名空间,该过程找不到节点,并在

处创建错误“Variant is null,无法调用”
XMLNode.setAttribute(AAttribute, AValue);

当我从 web.config 文件中删除命名空间定义时,上述过程调用起作用了。

对于C#来说,似乎有XmlNamespaceManager可以处理xml文档中的xml命名空间。对于Inno Setup,根据Inno Setup - XML编辑XPath请求失败并出现“运行时NIL接口异常”,我可以使用

XMLDocument.setProperty('SelectionNamespaces', xmlns:ns=''http://_namespace_''');.

如果我更改 SaveAttributeValueToXML

  XMLDocument.setProperty('SelectionLanguage', 'XPath');
  XMLDocument.setProperty('SelectionNamespaces', 'xmlns:ns=''http://schemas.microsoft.com/.NetConfiguration/v2.0''');
  XMLNode := XMLDocument.selectSingleNode('//ns:configuration/system.web.extensions/scripting/webServices/authenticationService');
  XMLNode.setAttribute(AAttribute, AValue);

XMLNode.setAttribute 仍会创建异常“Variant is null,无法调用”。因此, selectSingleNode 不会返回任何内容。我一定错过了什么。

web-config inno-setup xml-namespaces
1个回答
0
投票

感谢 Martin Prikryls 的评论和提示,我为我的问题创建了这个解决方案。

我在过程 SaveAttributeValueToXML 中为 Namespace 添加了一个新参数。

procedure SaveAttributeValueToXML(const AFileName, NameSpace, APath, AAttribute, AValue: string);
var
  XMLNode: Variant;
  XMLDocument: Variant;  
begin
  XMLDocument := CreateOleObject('Msxml2.DOMDocument.6.0');
  try
    XMLDocument.async := False;
    XMLDocument.load(AFileName);
    if (XMLDocument.parseError.errorCode <> 0) then
      MsgBox('The XML file could not be parsed. ' + 
        XMLDocument.parseError.reason, mbError, MB_OK)
    else
    begin
      XMLDocument.setProperty('SelectionLanguage', 'XPath');
      if Length(NameSpace) > 0 then
        XMLDocument.setProperty('SelectionNamespaces', 'xmlns:ns=''' + NameSpace + '''');
      XMLNode := XMLDocument.selectSingleNode(APath);
      XMLNode.setAttribute(AAttribute, AValue);
      XMLDocument.save(AFileName);
    end;
  except
    MsgBox('An error occured!' + #13#10 + GetExceptionMessage, 
      mbError, MB_OK); 
    Log('SaveAttributeValueToXML, AFileName: ' + AFileName + 
      ', APath: ' + APath +
      ', AAttribute: ' + AAttribute +
      ', AValue: ' + AValue); 
  end;
end;

就我而言,我称之为

SaveAttributeValueToXML(ConfigFileName, 'http://schemas.microsoft.com/.NetConfiguration/v2.0', '//ns:configuration/ns:system.web.extensions/ns:scripting/ns:webServices/ns:authenticationService', 'requireSSL', 'True');
© www.soinside.com 2019 - 2024. All rights reserved.