我想为使用 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 不会返回任何内容。我一定错过了什么。
感谢 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');