2010-01-21 14 views
6

Rozważam zapisywanie ustawień mojej aplikacji jako xml zamiast używania rejestru, ale mam problem ze zrozumieniem i używaniem OmniXML.Jak używać OmniXML do zapisywania ustawień aplikacji w pliku xml

Wiem, że niektórzy z was tutaj używają i polecają OnmiXML, więc mam nadzieję, że ktoś może dać mi wskazówki.

Używam TRegistry do tworzenia nowego klucza, jeśli nie istnieje, ale nie mogę znaleźć podobnej opcji w OmniXML.

Zasadniczo co chcę zrobić, to zapisać ustawienia na różnych poziomach XML, coś takiego:

<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> 

Teraz, podczas pierwszego uruchomienia programu nie będę mieć plik xml więc będę musiał tworzyć wszystko pod-poziomy. Dzięki TRegistry było to łatwe, wystarczy wywołać OpenKey (pathtokey, True), a klucz zostanie utworzony, jeśli nie istnieje. Czy istnieje jakiś porównywalny sposób na to samo, co w OmniXML? cos takiego jak:

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

Które stworzenie „ścieżki”, jeśli jeszcze nie istnieje.

Odpowiedz

10

Łatwą metodą zapisywania ustawień aplikacji w OmniXML jest użycie jednostki OmniXMLPersistent.

Jak wyjaśniono w OmniXML Sample Page wystarczy zdefiniować obiekt z opublikowanych właściwości iz TOmniXMLWriter klasy obiekt, który serializacji do pliku lub ciąg (ładowanego z TOmniXMLReader klasa)

Serializacja obsługuje obiektów zagnieżdżone, więc można mieć złożonych struktur, na przykład kod XML może być reprezentowany przez tych obiektów:

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'); 

to wszystko .. bez pisania pojedynczej linii xml yourse LF ...

Jeśli nadal preferują „ręczny” sposób, przyjrzeć jednostek OmniXMLUtils lub Fluent interface to OmniXML (napisany przez Primoz Gabrijelčič, autor OmniXML)

Ah .. dzięki za publiczne Primoz ta wspaniała biblioteka delphi!

+0

(Primoz tutaj) Tylko po to, aby zapobiec nieporozumieniom - OmniXML został napisany przez Miha Remec, właśnie dodałem kilka małych części. I +1 za odpowiedź - dokładnie to, co bym napisał. – gabr

+0

Dzięki Paolorossi za odpowiedź i kod. Niestety muszę również programowo odczytać/zapisać setki wartości, więc dla tej części naprawdę muszę ręcznie utworzyć/odczytać/usunąć dane. Ktoś wie, czy możliwe jest automatyczne tworzenie węzłów wcześniejszych, jeśli jeszcze nie istnieją? I na koniec wielkie podziękowania dla Miha Remec i Primoz Gabrijelcic dla odpowiednio OnmiXML i GpFluentXML. – smartins

Powiązane problemy