如何使用OmniXML在xml文件上保存应用程序的设置

时间:2010-01-21 21:50:57

标签: delphi

我正在考虑将我的应用程序设置保存为xml而不是使用注册表,但我很难理解并使用OmniXML。

我知道你们中的一些人在使用和推荐OnmiXML,所以我希望有人可以给我一些指示。

我习惯使用TRegistry来创建一个新密钥,如果它不存在,但我似乎无法在OmniXML上找到任何类似的选项。

基本上我想要做的是将设置保存在不同的XML级别上,如下所示:

<ProgramName version="6">
  <profiles>
    <profile name="Default">
      <Item ID="aa" Selected="0" />
      <Item ID="bb" Selected="1" />
    </profile>
  </profiles>
  <settings>
    <CheckForUpdates>1</CheckForUpdates>
    <CheckForUpdatesInterval>1</CheckForUpdatesInterval>
    <ShowSplashScreen></ShowSplashScreen>
  </settings>
</ProgramName>

现在,当第一次运行程序时,我没有xml文件,因此我需要创建所有子级别。使用TRegistry很容易,只需调用OpenKey(pathtokey,True),如果它不存在,将创建密钥。有没有类似的方法用OmniXML做同样的事情? 有些像:

SetNodeStr('./settings/CheckForUpdates', True);

如果它还不存在,那将创建“路径”。

1 个答案:

答案 0 :(得分:10)

使用OmniXML保存应用程序设置的简便方法是使用 OmniXMLPersistent 单元。

OmniXML Sample Page中所述,您只需定义一个具有已发布属性的对象,并使用 TOmniXMLWriter 类将对象序列化为文件或字符串(使用 TOmniXMLReader <加载< / strong> class)

序列化支持嵌套的对象,因此您可以使用复杂的结构,例如,您的xml可以由此对象表示:

type
  TAppProfiles = class(TCollection)
    ...
  end;

  TAppProfile = class(TCollectionItem)
    ...
  end;

  TAppSettings = class(TPersistent)
  private
    FCheckForUpdates: Integer;
    FCheckForUpdatesInterval: Integer;
    FShowSplashScreen: Boolean;
  published
    property CheckForUpdates: Integer read FCheckForUpdates write FCheckForUpdates;
    property CheckForUpdatesInterval: Integer read FCheckForUpdatesInterval write FCheckForUpdatesInterval;
    property ShowSplashScreen: Boolean read FShowSplashScreen write FShowSplashScreen;
  end;

  TAppConfiguration = class(TPersistent)
  private
    FProfiles: TAppProfiles;
    FSettings: TAppSettings;
  published
    property Profiles: TAppProfiles read FProfiles write FProfiles;
    property Settings: TAppSettings read FSettings write FSettings;
  end;

//Declare an instance of your configuration object
var
  AppConf: TAppConfiguration;

//Create it
AppConf := TAppConfiguration.Create;

//Serialize the object!
TOmniXMLWriter.SaveToFile(AppConf, 'appname.xml', pfNodes, ofIndent);

//And, of course, at the program start read the file into the object
TOmniXMLReader.LoadFromFile(AppConf, 'appname.xml');

这就是全部......没有自己写一行xml ......

如果您仍然喜欢“手动”方式,请查看OmniXMLUtils单元或Fluent interface to OmniXML(由OmniXML作者Primoz Gabrijelcic编写)

啊..公众感谢Primoz这个优秀的delphi库!