如何将变量值传递给 XML 文件



这是我从User输入端口号的代码.安装时,我想在Apache Tomcat服务器.xml文件中更改端口号。

我也使用文件部分传递 apache tomcat zip 文件并在运行部分中解压缩它

var
javaVersion: String;
javaPath: String;

端口号代码

function SetFocus(hWnd: HWND): HWND;
external 'SetFocus@user32.dll stdcall';
var
 SerialPage: TWizardPage;
  SerialEdits: array of TEdit;
const
 CF_TEXT = 1;
 VK_BACK = 8;
 SC_EDITCOUNT = 1;
 SC_CHARCOUNT = 4;

  procedure OnSerialEditChange(Sender: TObject);
var
I: Integer;
CanContinue: Boolean;
begin
 CanContinue := True;
 for I := 0 to GetArrayLength(SerialEdits) - 1 do
 if Length(SerialEdits[I].Text) < SC_CHARCOUNT then
 begin
  CanContinue := False;
  Break;
end;
WizardForm.NextButton.Enabled := CanContinue;
 end;
 function GetSerialNumber(Param: String): string;
  var
  I: Integer;
  begin
  Result := '';
  for I := 0 to GetArrayLength(SerialEdits) - 1 do
  Result := Result + SerialEdits[I].Text ;
  end;

 procedure OnSerialEditKeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
 var
   Edit: TEdit;
   EditIndex: Integer;
  begin
  Edit := TEdit(Sender);
  EditIndex := Edit.TabOrder - SerialEdits[0].TabOrder;
 if (EditIndex = 0) and (Key = Ord('V')) and (Shift = [ssCtrl]) then
 begin
 if TryPasteSerialNumber then
  Key := 0;
 end
 else
  if (Key >= 32) and (Key <= 255) then
   begin
  if Length(Edit.Text) = SC_CHARCOUNT - 1 then
    begin
   if EditIndex < GetArrayLength(SerialEdits) - 1 then
    SetFocus(SerialEdits[EditIndex + 1].Handle)
  else
    SetFocus(WizardForm.NextButton.Handle);
  end;
  end
  else
  if Key = VK_BACK then
  if (EditIndex > 0) and (Edit.Text = '') and (Edit.SelStart = 0) then
  SetFocus(SerialEdits[EditIndex - 1].Handle);
  end;

 procedure CreateSerialNumberPage;
        var
         I: Integer;
         Edit: TEdit;
         DescLabel: TLabel;
         EditWidth: Integer;
         begin
            SerialPage := CreateCustomPage(wpWelcome, 'Serial number validation',
'Enter the valid serial number');
DescLabel := TLabel.Create(SerialPage);
DescLabel.Top := 16;
DescLabel.Left := 0;
DescLabel.Parent := SerialPage.Surface;
DescLabel.Caption := 'Enter the valid serial number and continue with the   installation...';
DescLabel.Font.Style := [fsBold];
SetArrayLength(SerialEdits, SC_EDITCOUNT);
EditWidth := (SerialPage.SurfaceWidth - ((SC_EDITCOUNT - 1) * 8)) div SC_EDITCOUNT;
 for I := 0 to SC_EDITCOUNT - 1 do
  begin
 Edit := TEdit.Create(SerialPage);
 Edit.Top := 40;
 Edit.Left := I * (EditWidth + 8);
 Edit.Width := EditWidth;
 Edit.CharCase := ecUpperCase;
 Edit.MaxLength := SC_CHARCOUNT;
 Edit.Parent := SerialPage.Surface;
 Edit.OnChange := @OnSerialEditChange;
 Edit.OnKeyDown := @OnSerialEditKeyDown;
 SerialEdits[I] := Edit;
 end;
 end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = SerialPage.ID then
WizardForm.NextButton.Enabled := False;  
end;
procedure InitializeWizard;
begin
CreateSerialNumberPage;
 end ;

我想使用令牌替换用户在Tomcats服务器中输入的端口号.xml

<Connector port="##portnumber##" protocol="HTTP/1.1"
connectionTimeout="20000"         
redirectPort="8443" />
这是我

为你制作的脚本。我更改了输入端口号的方式,并展示了如何修改 XML 文件中的属性值。另请注意 AfterInstall 函数的用法:

#define TomcatDest "{app}tomcat"
#define TomcatFullPath TomcatDest + "apache-tomcat-7.0.42"
#define TomcatSrvConfigFile TomcatFullPath + "confserver.xml"
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}My Program
[Files]
Source: "unzip.exe"; DestDir: "{tmp}installertemps"
Source: "apache-tomcat-7.0.42.zip"; DestDir: "{tmp}installertemps"
[Run]
Filename: "{tmp}installertempsunzip.exe"; Parameters: " ""{tmp}installertempsapache-tomcat-7.0.42.zip"" -d ""{#TomcatDest}"" "; AfterInstall: UpdateConfigFile(ExpandConstant('{#TomcatSrvConfigFile}'))
[Code]
const
  DefaultPort = 8080;
var
  ConfigPage: TInputQueryWizardPage;
procedure SaveAttrValueToXML(const FileName, NodePath, Attribute,
  Value: string);
var
  XMLNode: Variant;
  XMLDocument: Variant;
begin
  XMLDocument := CreateOleObject('Msxml2.DOMDocument');
  try
    XMLDocument.async := False;
    XMLDocument.load(FileName);
    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(NodePath);
      XMLNode.setAttribute(Attribute, Value);
      XMLDocument.save(FileName);
    end;
  except
    MsgBox('An error occured!' + #13#10 + GetExceptionMessage,
      mbError, MB_OK);
  end;
end;
procedure InitializeWizard;
begin
  ConfigPage := CreateInputQueryPage(wpSelectDir, 'Tomcat configuration',
    'Description', 'SubCaption');
  ConfigPage.Add('Port:', False);
  ConfigPage.Values[0] := IntToStr(DefaultPort);
end;
function NextButtonClick(CurPageID: Integer): Boolean;
var
  PortNumber: Integer;
begin
  Result := True;
  if CurPageID = ConfigPage.ID then
  begin
    PortNumber := StrToIntDef(ConfigPage.Values[0], -1);
    // modify the statement to allow users enter only valid port numbers;
    // currently the value of -1 means that there is not even a number entered
    // in the edit box
    if (PortNumber = -1) then
    begin
      Result := False;
      MsgBox('You''ve entered invalid port number. The setup cannot continue...', mbError, MB_OK);
    end;
  end;
end;
procedure UpdateConfigFile(const FileName: string);
begin
  SaveAttrValueToXML(FileName, '//Server/Service/Connector', 'port',
    ConfigPage.Values[0]);
end;

最新更新