1

我正在开发一个应用程序来保存和读取 XML 的首选项。当我添加新功能时,我当然也添加了配置这些功能的能力,但我发现我的代码在尝试从尚不存在的 XML 读取变量时崩溃。发生这种情况时,任何应该读取的后续变量都不会被读取,这让我失去了一些偏好。以这段代码为例:

  xmldoc := TXMLDocument.Create(nil);
  Try
  xmldoc.LoadFromFile('c:\myxml.xml');
  xmldoc.Active := True;

  if xmldoc.ChildNodes.Count >= 1 then
    Begin
      Control := Root.ChildNodes.FindNode('Control');
      if Assigned(Control) then
      Begin
        Username.Text := Control.Attributes['Username'];
        Password.Text := Control.Attributes['Password'];
        AutoValidate.Checked := Control.Attributes['AutoValidate'];
        AutoIRC.Checked := Control.Attributes['AutoIRC'];
        Passive.Checked := Control.Attributes['Passive'];
        DoNothing.Checked := Control.Attributes['DoNothing'];
        OpenPage.Checked := Control.Attributes['OpenPage'];
        DownloadUsingBrowser.Checked := Control.Attributes['DownloadUsingBrowser'];
        RSSFeed.Checked := Control.Attributes['RSSFeed'];
        SaveToFolder.Checked := Control.Attributes['SaveToFolder'];
        SaveToFTP.Checked := Control.Attributes['SaveToFTP'];
        SavePath.Text := Control.Attributes['SavePath'];
        FTPPath.Text := Control.Attributes['FTPPath'];
      End;
    End;
  Finally
    xmldoc.Active := False;
  End;

假设我刚刚在“AutoValidate”中添加了一个选项 - XML 文件没有这个属性,因为它还没有被应用程序保存,但是应用程序在启动时仍然尝试读取这个属性(读取首选项)。

我怎样才能得到它,以便丢失的属性不会引发旧的“异常类 EVariantTypeCastError 和消息‘无法将类型的变体 (Null) 转换为类型 (Boolean)’”

4

1 回答 1

3

您应该首先测试属性的值。您可以创建一个实用函数,例如:

function xmlGetBoolAttrValue(ANode:iXMLNode; const AName:String; ADefault:boolean): boolean;
var
  V: variant;
begin
  Result := ADefault;
  if not Assigned(ANode) then
    exit;
  V := ANode.Attributes[AName];
  if VarIsNull(V) then
    exit;
  Result := V;
end;

并使用它

SaveToFTP.Checked := xmlGetBoolAttrValue(Control, 'SaveToFTP', false);
于 2013-06-24T14:32:52.430 回答