AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

MSXML-Parser, aber welcher?

Ein Thema von AndiOnline · begonnen am 19. Nov 2009 · letzter Beitrag vom 16. Aug 2010
Antwort Antwort
Seite 1 von 3  1 23      
AndiOnline

Registriert seit: 17. Jan 2005
6 Beiträge
 
#1

MSXML-Parser, aber welcher?

  Alt 19. Nov 2009, 10:21
Hallo

ich arbeite unter Delphi 2009 mit TXMLDocument und der xml-Datenbindung von Delphi. Als DOMVendor
ist MSXML eingestellt. Jetzt würde mich mal interessieren welchen MSXML-Parser Delphi verwendet.
Auf dem System ist MSXML4 und die akt. Version MSXML6 installiert. Delphi bindet bei mir die Unit
msxmldom in mein Projekt ein. Dort habe ich folgenden Code gefunden :

const
{ GUID's from MSXML2_TLB.pas }
CLASS_DOMDocument26: TGUID = '{F5078F1B-C551-11D3-89B9-0000F81FE221}';
CLASS_DOMDocument30: TGUID = '{F5078F32-C551-11D3-89B9-0000F81FE221}';
CLASS_DOMDocument40: TGUID = '{88D969C0-F192-11D4-A65F-0040963251E5}';

function TryObjectCreate(const GuidList: array of TGuid): IUnknown;
var
I: Integer;
Status: HResult;
begin
Status := S_OK;
for I := Low(GuidList) to High(GuidList) do
begin
Status := CoCreateInstance(GuidList[I], nil, CLSCTX_INPROC_SERVER or
CLSCTX_LOCAL_SERVER, IDispatch, Result);
if Status = S_OK then Exit;
end;
OleCheck(Status);
end;

function CreateDOMDocument: IXMLDOMDocument;
begin
Result := TryObjectCreate([CLASS_DOMDocument40, CLASS_DOMDocument30,
CLASS_DOMDocument26, msxml.CLASS_DOMDocument]) as IXMLDOMDocument;
if not Assigned(Result) then
raise DOMException.Create(SMSDOMNotInstalled);
end;

Bedeutet dies nun, dass unter Delphi 2009 grundsätzlich (bei MSXML) mit dem MSXML4-Parser
gearbeitet wird? Wenn ja, wie kann man den akt. MSXML6-Parser einbinden?

Gruß Andi
  Mit Zitat antworten Zitat
Alaitoc

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

Re: MSXML-Parser, aber welcher?

  Alt 19. Nov 2009, 10:57
Also wenn ich mich recht entsinne konnte ich MSXML6 zumindest unter Delphi 7 im Menü unter "Projekt\Typbibliothek importieren..." installieren, dabei wurd dann dementsprechend eine Unit für MSXML6 erstellt. Die konnte ich dann halt dementsprechend in mein Projekt einbinden, wobei ich mir dafür dann noch ne WrapperKlasse geschrieben hatte.

Ich schau aber gleich mal in der Pause nach wo das in Delphi 2k9 ist.

MfG Alaitoc
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#3

Re: MSXML-Parser, aber welcher?

  Alt 19. Nov 2009, 11:00
Könnte man das nicht einfach hinzufügen?

CLASS_DOMDocument60: TGUID = '{88D96A05-F192-11D4-A65F-0040963251E5}';
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#4

Re: MSXML-Parser, aber welcher?

  Alt 19. Nov 2009, 11:04
TXMLDocument nimmt die MSXML-Version, welche es als erstes findet,
also von denen, welche in dieser Liste stehen.

Bei dir wäre es also die Version 4.0,
es sei denn du erstellst dir selber die gewünschte Version ... du müßtest dann nur deine eigene Funktion nutzen

Delphi-Quellcode:
const CLASS_DOMDocument: TGUID = '{2933BF90-7B36-11D2-B20E-00C04F983E60}';

function CreateDOMDocument: IXMLDOMDocument;
begin
  Result := TryObjectCreate([CLASS_DOMDocument60, CLASS_DOMDocument40, CLASS_DOMDocument30,
    CLASS_DOMDocument26, msxml.CLASS_DOMDocument]) as IXMLDOMDocument;
  if not Assigned(Result) then
    raise DOMException.Create(SMSDOMNotInstalled);
end;
oder
Delphi-Quellcode:
var XML: IXMLDOMDocument;
OleCheck(CoCreateInstance(CLASS_DOMDocument60, nil, CLSCTX_INPROC_SERVER or
  CLSCTX_LOCAL_SERVER, IDispatch, XML));
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Alaitoc

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

Re: MSXML-Parser, aber welcher?

  Alt 19. Nov 2009, 11:11
Naja und es erstellt dann halt "nur" ein IXMLDomDocument, also ohne Funktionalitäten von z.b. MSXML6.
Da würde das IXMLDomDocument3 gebraucht soweit ich mich erinnern kann...

Wobei ich halt immer mit DOMDocument60 und CoDOMDocument60 gearbeitet habe, da hatte ich dann auch 100% alle Funktionalitäten fürs Validieren mit Schemas etc...

MfG Alaitoc
  Mit Zitat antworten Zitat
Alaitoc

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

Re: MSXML-Parser, aber welcher?

  Alt 19. Nov 2009, 12:20
Unter Delphi 2k9 kann man die Typbibiliothek über "Komponente\Komponente importieren" hinzufügen.
Einfach im Assistenten "Typbibliothek importieren" auswählen und dann nach MSXML suchen und die
gewünschte Version auswählen.

Damit sollte man zumindest mehr Möglichkeiten haben als mit der TXMLKomponente.

Wichtig: Der Anwender muss natürlich die dementsprechende Version auf dem Rechner haben.

Das kann man z.b. mit dieser Funktion feststellen, die ich irgendwo hier im Forum gefunden habe...

Leider vergessen wo genau her ^_° und bin mir nicht sicher ob man Änderungen für Delphi 2k9 dran vornehmen muss...

Delphi-Quellcode:

unit MSXMLCheck;

interface

uses SysUtils, Registry, Windows, Dialogs, MSXML6_TLB;

function CheckMSXML60:Boolean;
function CheckMSXML40:Boolean;
function CheckMSXML30:Boolean;
function CheckMSXML26:Boolean;

implementation

//**************************************************************************************
// Überprüfen der angegebenen MSXML Version durch die Registry
//**************************************************************************************

function ExpandEnvStr(const sInput: string): string;
const
  MAXSIZE = 32768;
begin
  SetLength(Result,MAXSIZE);
  SetLength(Result,
            ExpandEnvironmentStrings //The ExpandEnvironmentStrings function expands environment-variable strings and replaces them with their defined values.
              (pchar(sInput), // LPCTSTR lpSrc = pointer to string with environment variables
              @Result[1], // LPTSTR lpDst = pointer to string with expanded environment variables
              length(Result))); // DWORD nSize = maximum characters in expanded string
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
    begin
      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;
end;

//**************************************************************************************
// Überprüfen (MSXML 6.0)
//**************************************************************************************

function CheckMSXML60:Boolean;
begin
  result:=DoesMSXMLExist(CLASS_DOMDocument60);
end;

//**************************************************************************************
// Überprüfen (MSXML 4.0)
//**************************************************************************************

function CheckMSXML40:Boolean;
begin
  result:=DoesMSXMLExist(CLASS_DOMDocument40);
end;

//**************************************************************************************
// Überprüfen (MSXML 3.0)
//**************************************************************************************

function CheckMSXML30:Boolean;
begin
  result:=DoesMSXMLExist(CLASS_DOMDocument30);
end;

//**************************************************************************************
// Überprüfen (MSXML 2.6)
//**************************************************************************************

function CheckMSXML26:Boolean;
begin
  result:=DoesMSXMLExist(CLASS_DOMDocument26);
end;

end.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#7

Re: MSXML-Parser, aber welcher?

  Alt 19. Nov 2009, 12:27
Bei D2009/D2010 sollte es keine Probleme geben (zumindestens sieht alles gut so aus)

MSXMLCheck ... sollte es nicht eigentlich auch reichen, wenn man einfach mal versucht die verschiedenen Versionen zu erzeugen?

Delphi-Quellcode:
Uses ActiveX, MSXML;

Type TXMLDOMVersion = (xvXX, xv26, xv30, xv40, xv50, xv60);
  TXMLDOMVersions = Set of TXMLDOMVersion;

// xvXX in WinXP = xv30

Function CheckXMLDOMVersion: TXMLDOMVersions;
  Const DOMVer: Array[TXMLDOMVersion] of TGUID = (
      '{2933BF90-7B36-11D2-B20E-00C04F983E60}{msxml.CLASS_DOMDocument},
      '{F5078F1B-C551-11D3-89B9-0000F81FE221}{msxmldom.CLASS_DOMDocument26},
      '{F5078F32-C551-11D3-89B9-0000F81FE221}{msxmldom.CLASS_DOMDocument30},
      '{88D969C0-F192-11D4-A65F-0040963251E5}{msxmldom.CLASS_DOMDocument40},
      '{88D969E5-F192-11D4-A65F-0040963251E5}{CLASS_DOMDocument50},
      '{88D96A05-F192-11D4-A65F-0040963251E5}{CLASS_DOMDocument60});

  Var v: TXMLDOMVersion;
    XML: IXMLDOMDocument;

  Begin
    Result := [];
    For v := Low(v) to High(v) do
      If Succeeded(CoCreateInstance(DOMVer[v], nil, CLSCTX_INPROC_SERVER
          or CLSCTX_LOCAL_SERVER, IDispatch, XML)) Then
        Include(Result, v);
  End;
(wollte eigentlich in dem Array die vordefinierten "Konstanten" verwenden, aber da es typisierte Konstanten sind, sind sie ja eigentlich "Variablen" )
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Alaitoc

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

Re: MSXML-Parser, aber welcher?

  Alt 19. Nov 2009, 12:48
Naja ist halt so die Sache welche Version man brauch...
In meinem Editor zum Beispiel brauch man umbedingt die MSXML Version 6, da nur diese
vollständig die Validierung mit Schemas unterstützt.
Ich glaub bei der MSXML Version 4 war es auch möglich zu validieren, jedoch hat er nur
einen Validierungs-Fehler angezeigt...

Leider zeigt MSXML auch nur immer den ersten Parse-Fehler an und bricht dann ab. Da hab ich
leider noch keine einfache Lösung für gefunden...

Wenn man die TXML-Komponente verwendet ist es aber im Endeffekt egal welche MSXML Version man auf dem Rechner hat, solange man zumindest die 2.6er installiert hat. Sie bietet dafür aber auch meines Wissens nach nur wirklich die Standard - Funktionalitäten.

MfG Alaitoc
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#9

Re: MSXML-Parser, aber welcher?

  Alt 19. Nov 2009, 13:34
Vielleicht findest du dort ja noch ein paar Tipps/Hinweise/Ideen:
http://www.delphipraxis.net/internal...t.php?p=998360
http://forum.fachinformatiker.de/net...en-vb-net.html
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Alaitoc

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

Re: MSXML-Parser, aber welcher?

  Alt 19. Nov 2009, 13:59
Leider bin ich beim ersten Link der letzte Poster ^_° und
beim anderen handelt es sich ja um .Net Klassen.

Naja zur Zeit ist es zum Glück nicht nötig mehr Funktionalität einzubauen,
da der Editor für Testzwecke diente und halt für meine Wrapperklasse war und
ich sonst ne Wrapperklasse für die 2.6er Version für einen Parser geschrieben hatte.

Da meckert der Parser nu schon selbstständig, wenn was nicht korrekt ist *gg*.

Aber trotzdem Danke

@TE: Falls es noch Fragen zu MSXML gibt, wenn du die Typbibliotheken nutzt kannst du mich gerne anschreiben. Hab im Laufe meiner Recherchen eine umfangreiche Linksammlung zusammengestellt

MfG Alaitoc
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz