虽然 BennyBechDk 可能走在正确的轨道上,但他的代码存在一些问题,我将在下面更正:
uses Classes, XMLIntf, xmlDoc, SysUtils;
function IsValidXMLDoc(aXmlDoc: IXMLDocument): boolean;
var
validateDoc: IXMLDocument;
begin
result := false; // eliminate any sense of doubt, it starts false period.
validateDoc := TXMLDocument.Create(nil);
try
validateDoc.ParseOptions := [poResolveExternals, poValidateOnParse];
validateDoc.XML := aXmlDoc.XML;
validateDoc.Active := true;
Result := True;
except
// for this example, I am going to eat the exception, normally this
// exception should be handled and the message saved to display to
// the user.
end;
end;
如果您希望系统只引发异常,那么首先没有理由让它成为一个函数。
uses Classes, XMLIntf, XMLDoc, SysUtils;
procedure ValidateXMLDoc(aXmlDoc: IXMLDocument);
var
validateDoc: IXMLDocument;
begin
validateDoc := TXMLDocument.Create(nil);
validateDoc.ParseOptions := [poResolveExternals, poValidateOnParse];
validateDoc.XML := aXmlDoc.XML;
validateDoc.Active := true;
end;
因为 validateDoc 是一个接口,它会随着函数/过程的退出而被正确的处理掉,不需要自己去处理。如果您调用 ValidateXmlDoc 并且没有收到异常,那么它是有效的。就我个人而言,我喜欢第一次调用 IsValidXMLDoc,如果有效则返回 true,否则返回 false(并且不会在自身之外引发异常)。