本文介绍了如何在 Inno Setup 中读写 XML 文档节点值?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想读取 XML 文件的一些节点并在一些自定义输入字段中显示它们的值.然后用户可以根据需要更改这些值,并通过单击 Next 按钮将这些值保存回 XML.

I want to read some nodes of a XML file and show their values in some custom input fields. User can then change the values if needed, and by clicking the Next button these values should be saved back to the XML.

如何在 Inno Setup 脚本中执行此操作?

How to do this in Inno Setup script ?

推荐答案

使用 CreateOleObject 函数来实例化标准 MSXML2.DOMDocument COM 对象.以下脚本显示了如何从下面发布的 XML 文件中加载和保存单个节点的文本值(脚本本身的灵感来自 MSDN 的示例):

Use the CreateOleObject function to instantiate the standard MSXML2.DOMDocument COM object. The following script shows how to load and save a text value for a single node from the XML file posted below (the script itself was inspired by the examples from MSDN):

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

这里是脚本中使用的 XML 文件:

Here is the XML file used in the script:

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

这篇关于如何在 Inno Setup 中读写 XML 文档节点值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-22 22:34