Naja die Frage ist halt wie elegant du das haben willst, also das simpelste wäre ja nu wenn du diese Funktion ( die ich irgendwo aus dem Forum habe ) nutzt und die
MSXML-Version überprüfst:
Delphi-Quellcode:
function ExpandEnvStr(
const sInput:
string):
string;
const
MAXSIZE = 32768;
begin
SetLength(Result,MAXSIZE);
SetLength(Result,ExpandEnvironmentStrings(pchar(sInput),
@Result[1],length(Result)));
end;
function DoesMSXMLExist(CLASS_DOMDocument:TGUID): boolean;
var
reg : TRegistry;
s :
string;
begin
Result := false;
reg := TRegistry.Create(KEY_READ);
if(reg <>
nil)
then
with reg
do try
RootKey := HKEY_CLASSES_ROOT;
if(OpenKey('
CLSID\' + GuidToString(CLASS_DOMDocument) +
'
\InProcServer32',false))
then
try
s := ReadString('
');
Result := fileexists(ExpandEnvStr(s));
finally
CloseKey;
end;
finally
Free;
end;
end;
function CheckMSXML6:Boolean;
begin
result:=DoesMSXMLExist(CLASS_DOMDocument60);
end;
function CheckMSXML4:Boolean;
begin
result:=DoesMSXMLExist(CLASS_DOMDocument40);
end;
function CheckMSXML3:Boolean;
begin
result:=DoesMSXMLExist(CLASS_DOMDocument30);
end;
function CheckMSXML2:Boolean;
begin
result:=DoesMSXMLExist(CLASS_DOMDocument26);
end;
Für den Parser benutzte dann IXMLDOMDocument2, da kannste 4.0 oder 6.0 erstellen ( aber dann halt nur die 4.0er Funktionen nutzen).
Für die SchemaCollection benutzte dann IXMLDOMSchemaCollection2, da kannste dann entweder die 4.0 oder 6.0 Version erstellen.
Delphi-Quellcode:
function LoadMSDom(const FileName: WideString): IXMLDOMDocument2;
begin
if CheckMSXML6 then
begin
Result := CoDOMDocument60.Create;
end
else if CheckMSXML4 then
begin
Result := CoDOMDocument40.Create;
end
else
// ERROR oder so
end;
Result.async := False;
Result.resolveExternals := True; //False;
Result.validateOnParse := True;
Result.load(FileName);
end;
{ Validate }
procedure InternalValidateXMLDoc(const Doc: IDOMDocument; const SchemaDoc: IXMLDOMDocument2; const SchemaNS: WideString);
var
MsxmlDoc: IXMLDOMDocument2;
SchemaCache: IXMLDOMSchemaCollection2;
Error: IXMLDOMParseError;
begin
MsxmlDoc := DOMToMSDom(Doc);
if CheckMSXML6 then
begin
SchemaCache := CoXMLSchemaCache60.Create;
end
else if CheckMSXML4 then
begin
Result := CoXMLSchemaCache40.Create;
end
else
// ERROR oder so
end;
SchemaCache.add(SchemaNS, SchemaDoc);
MsxmlDoc.schemas := SchemaCache;
Error := MsxmlDoc.validate;
if Error.errorCode <> S_OK then
raise EValidateXMLError.Create(Error.errorCode, Error.reason);
end;
Da du ja dann die Interfaces benutzt und beide Versionen mit denen kompatibel sind, sollte es dabei keine Probleme geben
Falls ich mich nicht irre ^_°
MfG Alaitoc