2010-01-21 15 views
6

पर किसी एप्लिकेशन की सेटिंग्स को सहेजने के लिए OmniXML का उपयोग कैसे करें I रजिस्ट्री का उपयोग करने के बजाय मेरी एप्लिकेशन सेटिंग्स को xml के रूप में सहेजने पर विचार कर रहा हूं लेकिन मुझे ओमनीएक्सएमएल को समझने और उपयोग करने में कठिनाई हो रही है।एक XML फ़ाइल

मुझे पता है कि आप में से कुछ यहां ओन्मीएक्सएमएल का उपयोग करते हैं और फिर से सिफारिश करते हैं, इसलिए मुझे उम्मीद है कि कोई मुझे कुछ पॉइंटर्स दे सकता है।

यदि मैं अस्तित्व में नहीं हूं, तो मुझे नई कुंजी बनाने के लिए ट्रांजिस्ट्री का उपयोग करने के लिए उपयोग किया जाता है, लेकिन मुझे OmniXML पर कोई भी समान विकल्प नहीं दिख रहा है।

<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 फ़ाइल है इसलिए मैं सभी बनाने की आवश्यकता होगी:

असल में मैं क्या करना चाहते हैं अलग एक्सएमएल स्तरों पर सेटिंग्स को सहेजने, कुछ इस तरह है सब-स्तरों। ट्रांजिस्ट्री के साथ यह आसान था, बस ओपनके (पथटोकी, ट्रू) को कॉल करें और कुंजी मौजूद नहीं होगी यदि यह अस्तित्व में नहीं है। क्या OmniXML के साथ एक ही चीज़ करने का कोई तुलनीय तरीका है? someting की तरह:

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

कौन सा "पथ" बनाना होगा कि वह पहले से मौजूद नहीं है।

उत्तर

10

ओमनीएक्सएमएल के साथ एप्लिकेशन सेटिंग्स को सहेजने का आसान तरीका OmniXMLPersistent इकाई का उपयोग करना है।

रूप OmniXML Sample Page में विस्तार से बताया तो आप बस प्रकाशित गुणों के साथ एक वस्तु को परिभाषित करने और TOmniXMLWriter वर्ग के साथ आप किसी फ़ाइल या एक स्ट्रिंग (TOmniXMLReader वर्ग के साथ लोड हो रहा है)

क्रमबद्धता वस्तुओं का समर्थन करता है के लिए वस्तु को क्रमानुसार नेस्ट, ताकि आप जटिल संरचनाओं हो सकता था, उदाहरण के लिए अपने 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'); 

बस इतना ही .. एक्सएमएल yourse की एक पंक्ति लिख बिना है वामो ...

आप अभी भी "मैन्युअल" जिस तरह से पसंद करते हैं, OmniXMLUtils इकाइयों या Fluent interface to OmniXML

आह .. के लिए प्रिमोज़ सार्वजनिक धन्यवाद (प्रिमोज़ Gabrijelcic, OmniXML लेखक द्वारा लिखित) पर एक नज़र यह उत्कृष्ट डेल्फी पुस्तकालय!

+0

(यहां प्राइमोज़) बस भ्रम को रोकने के लिए - ओमनीएक्सएमएल मिहा रेमेक द्वारा लिखा गया था, मैंने अभी कुछ छोटे हिस्सों का योगदान दिया है। और उत्तर के लिए +1 - यह वही है जो मैं लिखूंगा। – gabr

+0

उत्तर और कोड के लिए धन्यवाद paolorossi। दुर्भाग्य से मुझे सैकड़ों मूल्यों को प्रोग्रामेटिक रूप से पढ़ना/लिखना भी है, इसलिए उस विशेष भाग के लिए, मुझे वास्तव में डेटा को मैन्युअल रूप से बनाने/पढ़ने/हटाने की आवश्यकता है। किसी को पता है कि अगर वे पहले से मौजूद नहीं हैं तो पूर्ववर्ती नोड्स को स्वतः बनाना संभव है? और आखिरकार ओन्मीएक्सएमएल और जीपीफ्लुएंटएक्सएमएल के लिए मिहा रेमेक और प्राइमोज गैब्रिजेलिक के लिए एक बड़ा धन्यवाद। – smartins

संबंधित मुद्दे