Come leggere e scrivere i valori del nodo del documento XML?

Voglio leggere alcuni nodes di un file XML e mostrare i loro valori in alcuni campi di input personalizzati. L’utente può quindi modificare i valori, se necessario, e facendo clic sul pulsante Next , questi valori dovrebbero essere salvati in XML.

Come fare questo nello script InnoSetup?

Utilizzare la funzione CreateOleObject per CreateOleObject un’istanza dell’object COM standard MSXML2.DOMDocument . Il seguente script mostra come caricare e salvare un valore di testo per un singolo nodo dal file XML indicato di seguito (lo script stesso è stato ispirato dagli esempi di MSDN):

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

Ecco il file XML utilizzato nello script:

   First node value! Second node value!