Einzelnen Beitrag anzeigen

Alaitoc

Registriert seit: 24. Okt 2008
263 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: [MSXML + XSD-Validation] Welche MSXML Version?

  Alt 4. Jan 2010, 10:19
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
  Mit Zitat antworten Zitat