更改 TXMLDocument.SaveToFile 的行为
Change behavior of TXMLDocument.SaveToFile
在生产中,我们有时会遇到 "Access denied" 类型的异常。
调用栈来自这一行
vXML.SaveToFile(文件名);
其中 vXML 是 IXMLDocument。
这里的问题是没有记录文件名。
我试过这个小测试程序。
implementation
uses
xmldoc, Unit12;
{$R *.dfm}
procedure TForm11.FormShow(Sender: TObject);
const
cnFile = 'C:\Program Files (x86)\test.xml';
var
vXML: TAttracsXMLDoc;
begin
vXML := TAttracsXMLDoc.Create(nil);
try
vXML.Active := True;
// Process vXML
vXML.SaveToFile(cnFile);
finally
vXML.Free;
end;
end;
和其他单位
unit Unit12;
interface
uses
xmldoc,
xml.xmldom,
Xml.XMLIntf;
type
TAttracsXMLDoc = class(TXMLDocument)
procedure SaveToFile(const AFileName: DOMString); override;
end;
implementation
uses
Sysutils;
procedure TAttracsXMLDoc.SaveToFile(const AFileName: DOMString);
begin
try
inherited SaveToFile(AFileName);
except
on E: Exception do
begin
E.Message := E.Message + ' ' + AFileName + ' cannot be saved';
raise;
end;
end;
end;
end.
它按预期工作。但问题是不再使用接口 IXMLDocument。我想使用这样的代码:
procedure TForm11.FormShow(Sender: TObject);
const
cnFile = 'C:\Program Files (x86)\test.xml';
var
vXML: IXMLDocument;
begin
vXML := NewXMLDocument;
// Process vXML
vXML.SaveToFile(cnFile);
end;
并且在对现有代码进行最小更改的情况下捕获上面的异常,并带有明显的原因错误。什么是最佳路径?
只需将 NewXMLDocument()
替换为 TAttracsXMLDoc
,然后您将获得所需的行为:
function NewAttracsXMLDocument: IXMLDocument;
begin
Result := TAttracsXMLDoc.Create(nil);
end;
procedure TForm11.FormShow(Sender: TObject);
const
cnFile = 'C:\Program Files (x86)\test.xml';
var
vXML: IXMLDocument;
begin
vXML := NewAttracsXMLDocument; //NewXMLDocument;
// Process vXML
vXML.SaveToFile(cnFile);
end;
在生产中,我们有时会遇到 "Access denied" 类型的异常。 调用栈来自这一行
vXML.SaveToFile(文件名);
其中 vXML 是 IXMLDocument。
这里的问题是没有记录文件名。 我试过这个小测试程序。
implementation
uses
xmldoc, Unit12;
{$R *.dfm}
procedure TForm11.FormShow(Sender: TObject);
const
cnFile = 'C:\Program Files (x86)\test.xml';
var
vXML: TAttracsXMLDoc;
begin
vXML := TAttracsXMLDoc.Create(nil);
try
vXML.Active := True;
// Process vXML
vXML.SaveToFile(cnFile);
finally
vXML.Free;
end;
end;
和其他单位
unit Unit12;
interface
uses
xmldoc,
xml.xmldom,
Xml.XMLIntf;
type
TAttracsXMLDoc = class(TXMLDocument)
procedure SaveToFile(const AFileName: DOMString); override;
end;
implementation
uses
Sysutils;
procedure TAttracsXMLDoc.SaveToFile(const AFileName: DOMString);
begin
try
inherited SaveToFile(AFileName);
except
on E: Exception do
begin
E.Message := E.Message + ' ' + AFileName + ' cannot be saved';
raise;
end;
end;
end;
end.
它按预期工作。但问题是不再使用接口 IXMLDocument。我想使用这样的代码:
procedure TForm11.FormShow(Sender: TObject);
const
cnFile = 'C:\Program Files (x86)\test.xml';
var
vXML: IXMLDocument;
begin
vXML := NewXMLDocument;
// Process vXML
vXML.SaveToFile(cnFile);
end;
并且在对现有代码进行最小更改的情况下捕获上面的异常,并带有明显的原因错误。什么是最佳路径?
只需将 NewXMLDocument()
替换为 TAttracsXMLDoc
,然后您将获得所需的行为:
function NewAttracsXMLDocument: IXMLDocument;
begin
Result := TAttracsXMLDoc.Create(nil);
end;
procedure TForm11.FormShow(Sender: TObject);
const
cnFile = 'C:\Program Files (x86)\test.xml';
var
vXML: IXMLDocument;
begin
vXML := NewAttracsXMLDocument; //NewXMLDocument;
// Process vXML
vXML.SaveToFile(cnFile);
end;