2010-01-21 17 views
6

Estoy considerando guardar la configuración de mi aplicación como un xml en lugar de usar el registro, pero me está costando entender y usar OmniXML.Cómo usar OmniXML para guardar la configuración de una aplicación en un archivo xml

Sé que algunos de ustedes aquí usan y recomiendan OnmiXML, así que espero que alguien me pueda dar algunos consejos.

Estoy acostumbrado a usar TRegistry para crear una nueva clave si no existe, pero parece que no puedo encontrar ninguna opción similar en OmniXML.

Básicamente lo que quiero hacer es guardar la configuración en diferentes niveles XML, algo como esto:

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

Ahora, cuando se ejecuta por primera vez el programa que no tendrá el archivo XML por lo que tendrá que crear toda la subniveles. Con TRegistry fue fácil, simplemente llame a OpenKey (pathtokey, True) y la clave se creará si no existe. ¿Hay alguna manera comparable de hacer lo mismo con OmniXML? calle detrás como:

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

que crearía el "camino" si no existe ya.

Respuesta

10

El método sencillo para guardar la configuración de la aplicación con OmniXML es utilizar la unidad OmniXMLPersistent.

Como se explica en OmniXML Sample Page sólo tiene que definir un objeto con el portal de anuncios y con la TOmniXMLWriter clase serializar el objeto a un archivo o una cadena (carga con el clase TOmniXMLReader)

La serialización es compatible con los objetos anidado, lo que podría tener estructuras complejas, por ejemplo el código XML podría ser representado por estos objetos:

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

Eso es todo .. sin necesidad de escribir una sola línea de yourse xml Si ...

Si aún prefiere la forma "manual", echar un vistazo a las unidades OmniXMLUtils o la Fluent interface to OmniXML (escrito por Primoz Gabrijelcic, el autor OmniXML)

Ah .. público gracias a Primoz para esta excelente biblioteca delphi!

+0

(Primoz aquí) Solo para evitar confusiones: OmniXML fue escrito por Miha Remec, solo contribuí con algunas partes pequeñas. Y +1 por la respuesta, es exactamente lo que escribiría. – gabr

+0

Gracias paolorossi por la respuesta y el código. Lamentablemente, también tengo que leer/escribir cientos de valores por programación, por lo que para esa parte en particular, realmente necesito crear/leer/eliminar manualmente los datos. ¿Alguien sabe si es posible crear automáticamente nodos precedentes si todavía no existen? Y finalmente un gran agradecimiento a Miha Remec y Primoz Gabrijelcic por OnmiXML y GpFluentXML respectivamente. – smartins

Cuestiones relacionadas