Einzelnen Beitrag anzeigen

alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#1

[MSXML + XSD-Validation] Welche MSXML Version?

  Alt 4. Jan 2010, 11:04
Hallo,

Ich habe hier gerade ein kleines Problem: Eine Anwendung, die sowohl under XP-Embedded als auch unter Vista laufen soll, muss XML-Dateien per XSD validieren. Ich habe dazu die Unit XMLValidate.PAS von CodeGear/Embarcadero geladen, die ihrerseits MSXML 4.0 voraussetzt. Die Anwendung war zunächst für XP-embedded konzipiert. Bei der vorliegenden Installation ist MSXML 4.0 installiert und die Anwendung funktioniert tadellos.

Die gleiche Anwendung funktioniert jedoch nicht mit Vista:
Zitat von Die Anwendung, gestartet unter Vista,:
Class not registered, ClassID: {88D969C2-F192-11D4-A65F-0040963251E5}
Die GUID gehört zum Interface 'XMLSchemaCache40'. Offensichtlich ist MSXML 4.0 nicht installiert.

Frage: Soll ich wirklich extra dafür MSXML 4.0 nachträglich unter Vista installieren, oder geht das nicht auch anders ("Wenn MSXML 6.0 nimm diese Version, sonst die 4.0er"). Die Funktionalität selbst ist ja in 6.0 drin, denke ich mir, nur die GUIDs sind anders.

Der relevante Teil aus XMLValidate.Pas ist:

Delphi-Quellcode:
function LoadMSDom(const FileName: WideString): IXMLDOMDocument2;
begin
  Result := CoDOMDocument40.Create; // <-------
  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: IXMLDOMSchemaCollection;
  Error: IXMLDOMParseError;
begin
  MsxmlDoc := DOMToMSDom(Doc);
  SchemaCache := CoXMLSchemaCache40.Create; // <<--------
  SchemaCache.add(SchemaNS, SchemaDoc);
  MsxmlDoc.schemas := SchemaCache;
  Error := MsxmlDoc.validate;
  if Error.errorCode <> S_OK then
    raise EValidateXMLError.Create(Error.errorCode, Error.reason);
end;
Ich müsste also zur Laufzeit irgendwie entscheiden, ob ich MSXML 4.0 oder 6.0 verwenden soll (das würde über eine einfache Prüfung gehen). Die Frage ist: WIE kann ich die *Verwendung* von V4.0 bzw. V6.0 transparent und elegant implementieren?
Oder sollte ich doch einfach MSXML4.0 nachrüsten?
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat