Хотя 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, если нет (и не вызывает исключений вне себя).