2012-06-28 21 views
11

Bazı XML dosya düğümlerini okumak ve bazı özel giriş alanlarındaki değerlerini göstermek istiyorum. Kullanıcı daha sonra gerekirse değerleri değiştirebilir ve Next düğmesini tıklatarak bu değerler XML'ye geri kaydedilmelidir.XML belge düğümü değerleri nasıl okunur ve yazılır?

InnoSetup dosyasında nasıl kullanılır?

+0

İlgili soru: [Inno Ayarı, özel girdiye dayalı XML dosyasını değiştir] (http://stackoverflow.com/q/8141886/588306). – Deanna

cevap

23

MSXML2.DOMDocument COM nesnesini başlatmak için CreateOleObject işlevini kullanın. İşte

[Setup] 
AppName=My Program 
AppVersion=1.5 
DefaultDirName={pf}\My Program 
DefaultGroupName=My Program 
UninstallDisplayIcon={app}\MyProg.exe 
Compression=lzma2 
SolidCompression=yes 
OutputDir=userdocs:Inno Setup Examples Output 

[Files] 
Source: "MyProg.exe"; DestDir: "{app}" 
Source: "MyProg.chm"; DestDir: "{app}" 

[Icons] 
Name: "{group}\My Program"; Filename: "{app}\MyProg.exe" 

[Code] 
var 
    CustomEdit: TEdit; 
    CustomPageID: Integer; 

function LoadValueFromXML(const AFileName, APath: string): string; 
var 
    XMLNode: Variant; 
    XMLDocument: Variant; 
begin 
    Result := ''; 
    XMLDocument := CreateOleObject('Msxml2.DOMDocument.6.0'); 
    try 
    XMLDocument.async := False; 
    XMLDocument.load(AFileName); 
    if (XMLDocument.parseError.errorCode <> 0) then 
     MsgBox('The XML file could not be parsed. ' + 
     XMLDocument.parseError.reason, mbError, MB_OK) 
    else 
    begin 
     XMLDocument.setProperty('SelectionLanguage', 'XPath'); 
     XMLNode := XMLDocument.selectSingleNode(APath); 
     Result := XMLNode.text; 
    end; 
    except 
    MsgBox('An error occured!' + #13#10 + GetExceptionMessage, mbError, MB_OK); 
    end; 
end; 

procedure SaveValueToXML(const AFileName, APath, AValue: string); 
var 
    XMLNode: Variant; 
    XMLDocument: Variant; 
begin 
    XMLDocument := CreateOleObject('Msxml2.DOMDocument.6.0'); 
    try 
    XMLDocument.async := False; 
    XMLDocument.load(AFileName); 
    if (XMLDocument.parseError.errorCode <> 0) then 
     MsgBox('The XML file could not be parsed. ' + 
     XMLDocument.parseError.reason, mbError, MB_OK) 
    else 
    begin 
     XMLDocument.setProperty('SelectionLanguage', 'XPath'); 
     XMLNode := XMLDocument.selectSingleNode(APath); 
     XMLNode.text := AValue; 
     XMLDocument.save(AFileName); 
    end; 
    except 
    MsgBox('An error occured!' + #13#10 + GetExceptionMessage, mbError, MB_OK); 
    end; 
end; 

procedure InitializeWizard; 
var 
    CustomPage: TWizardPage; 
begin 
    CustomPage := CreateCustomPage(wpWelcome, 'Custom Page', 
    'Enter the new value that will be saved into the XML file'); 
    CustomPageID := CustomPage.ID; 
    CustomEdit := TEdit.Create(WizardForm); 
    CustomEdit.Parent := CustomPage.Surface; 
end; 

procedure CurPageChanged(CurPageID: Integer); 
begin 
    if CurPageID = CustomPageID then 
    CustomEdit.Text := LoadValueFromXML('C:\Setup.xml', '//Setup/FirstNode'); 
end; 

function NextButtonClick(CurPageID: Integer): Boolean; 
begin 
    Result := True; 
    if CurPageID = CustomPageID then 
    SaveValueToXML('C:\Setup.xml', '//Setup/FirstNode', CustomEdit.Text); 
end; 

kullanılan XML dosyasını edilir: Aşağıdaki komut dosyası yüklemek ve (kendisi MSDN'den örneklerden ilham alınarak senaryo) aşağıda yayınlanmıştır XML dosyasından tek bir düğüm için bir metin değeri kaydetmek için gösterir komut dosyası:

<?xml version="1.0" encoding="UTF-8"?> 
<Setup> 
    <FirstNode>First node value!</FirstNode> 
    <SecondNode>Second node value!</SecondNode> 
</Setup> 
+0

P.S. Bu komut dosyasındaki her bir OLE nesnesi işlev çağrısını, işlev çağrısında istisnayı (önceki) artıracak olan ['OleCheck'] (http://www.jrsoftware.org/ishelp/topic_isxfunc_olecheck.htm) ile sarmak iyi olur. başarısız olur (sonuç S_OK'un değerinden farklı olduğunda). – TLama

+0

Ayrıca bkz. [CodeAutomation.iss] örneği (https://woofy.googlecode.com/hg/tools/Inno%20Setup/Examples/CodeAutomation.iss). – Deanna

+0

@Deanna, Bu örneği yayınlamadan önce bu örneğe bakıyordum, ancak bu, düğümün bir XML dosyasına nasıl eklenmesi gerektiğiyle ilgilidir. Bu, mevcut düğüm değerini nasıl yükleyeceğimizi ve kaydedeceğimizle ilgilidir ;-) – TLama

İlgili konular