2012-06-28 10 views
11

Ich möchte einige Knoten einer XML-Datei lesen und ihre Werte in einigen benutzerdefinierten Eingabefeldern anzeigen. Der Benutzer kann dann die Werte bei Bedarf ändern, und durch Klicken auf die Schaltfläche Next sollten diese Werte wieder in XML gespeichert werden.Wie kann ich XML-Dokumentenknotenwerte lesen und schreiben?

Wie in InnoSetup Skript?

+0

Verwandte Frage: [Inno-Setup ändern XML-Datei basierend auf benutzerdefinierten Eingaben] (http://stackoverflow.com/q/8141886/588306). – Deanna

Antwort

23

Verwenden Sie die CreateOleObject-Funktion, um das Standard-COM-Objekt MSXML2.DOMDocument zu instanziieren. Das folgende Skript zeigt, wie laden und einen Textwert für einen einzelnen Knoten aus der XML-Datei geschrieben unter an (das Skript selbst durch die Beispiele von MSDN inspiriert wurde) zu speichern:

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

Hier wird die XML-Datei in dem verwendeten Skript:

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

P.S. Es wäre gut, jeden OLE-Objektfunktionsaufruf in diesem Skript mit dem [OleCheck] (http://www.jrsoftware.org/ishelp/topic_isxfunc_oleckeck.htm) zu umbrechen, wodurch die Ausnahme (früher) beim Funktionsaufruf ausgelöst wird schlägt fehl (wenn das Ergebnis vom Wert "S_OK" abweicht). – TLama

+0

Siehe auch das Beispiel [CodeAutomation.iss] (https://woofy.googlecode.com/hg/tools/Inno%20Setup/Examples/CodeAutomation.iss). – Deanna

+0

@Deanna, ich habe in diesem Beispiel nachgeschaut, bevor ich das gepostet habe, aber es geht darum, Knoten in eine XML-Datei einzufügen, während es darum geht, den vorhandenen Knotenwert zu laden und zu speichern ;-) – TLama

Verwandte Themen