Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Alternative zum MSXML (https://www.delphipraxis.net/20455-alternative-zum-msxml.html)

philwo 18. Apr 2004 11:49


Alternative zum MSXML
 
Huhu,

ich code gerade an einem Programm, welches seine Daten in einer XML Datei speichert. Dazu habe ich bis vor kurzem noch den MSXML Parser benutzt. Wie der Zufall es wollte, installierte ich gerade eben das neue GExperts 1.20b1 und las die Readme (manchmal stehen da wirklich interessante Sachen drin ;)) und die erwähnten da eine Bibliothek namens OmniXML, womit sie ihre Daten speichern. *denk* XML ist immer gut, dachte ich mir und surfte zur angegebenen URL (www.omnixml.com) und stellte fest, dass das ein zur MSXML kompatibler Opensource (Mozilla Public License 1.1) XML Parser für Delphi ist. :) Ich habe ihn gerade in mein Programm eingebunden und das Portieren bestand einfach nur darin, aus den verwendeten Objekten wie IXMLDOMNode, IXMLDOMDocument2 sowas wie IXMLNode und IXMLDocument zu machen, außerdem wird das IXMLDocument nicht mit CoDOMDocument40.Create() sondern mit CreateXMLDoc() erstellt. Vielleicht interessiert es irgendjemanden, vielleicht als Alternative zu Microsoft Produkten, vielleicht einfach als besserer XML-Parser (jedenfalls ist er auf den ersten Blick besser, kann jedenfalls mehr). Ah, bevor ich es vergesse: Die hier oft gestellte Frage, wie man denn die XML-Dokumente "schön" speichern kann, lässt sich damit auch lösen: Aus
Code:
xmldoc.save(strFileName);
wird
Code:
xmldoc.save(strFileName, ofIndent);
. :)

Bis denn,
Philipp

CalganX 18. Apr 2004 12:05

Re: Alternative zum MSXML
 
Hi Philipp,
wie läuft das ganze denn? Ist das komplett eigenständig, oder baut das auf einem anderen Parser auf? Ist das ganze schnell, oder eher langsamer als MSXML?

Chris

CalganX 18. Apr 2004 12:16

Re: Alternative zum MSXML
 
Hi,
ich hab mir das gerade mal angesehen. So wie das aussieht, ist das eigentlich nur ein Aufsatz auf MSXML4. Ich werde es jetzt aber auf jedenfall mal ausprobieren, weil ich ja mal versuchen will meine Software fertigzustellen. ;)

Chris

philwo 18. Apr 2004 14:14

Re: Alternative zum MSXML
 
Nein, das stimmt nicht, es ist ein komplett selbstgecodeter Parser für XML. Es *kann* als Fundament auch den MSXML benutzen, falls der einem besser gefällt und dann fungiert OmniXML als Wrapper. Das ist aber natürlich nur zu empfehlen, falls der MSXML wirklich mal was besser können sollte... ;)

Philipp

PS. Hey, du bist ja schon wieder aus dem Urlaub zurück, Chris! :)

MathiasSimmack 18. Apr 2004 14:18

Re: Alternative zum MSXML
 
Sehr schön. Werde ich mir auch gleich mal anschauen. :)

CalganX 18. Apr 2004 14:26

Re: Alternative zum MSXML
 
Hi,
Zitat:

Zitat von philwo
Nein, das stimmt nicht, es ist ein komplett selbstgecodeter Parser für XML. Es *kann* als Fundament auch den MSXML benutzen, falls der einem besser gefällt und dann fungiert OmniXML als Wrapper. Das ist aber natürlich nur zu empfehlen, falls der MSXML wirklich mal was besser können sollte... ;)

Hm... :? Irgendwie ist mir das ganze durchaus suspekt. Nun gut. Scheinbar funktioniert es. Mal sehen ob es sich auch in der Praxis durchsetzen kann.

Aber dann eine Frage: wenn ich OmniXML verwenden würde, müsste ich dazu dann kein MS XML mitliefern?

Zitat:

Zitat von philwo
PS. Hey, du bist ja schon wieder aus dem Urlaub zurück, Chris! :)

Jepp, kann ja nicht ewig weg sein. :(

Chris

MathiasSimmack 18. Apr 2004 15:14

Re: Alternative zum MSXML
 
Zitat:

Zitat von Chakotay1308
Irgendwie ist mir das ganze durchaus suspekt.

Warum? Es macht immerhin einen guten Eindruck, und die Umlernphase (wenn man bisher nur mit MS-XML gearbeitet hat) ist recht kurz.

Zitat:

Aber dann eine Frage: wenn ich OmniXML verwenden würde, müsste ich dazu dann kein MS XML mitliefern?
Ich denke: Nein.

Aber hey, eins kann OmniXML noch nicht: XML-Code umwandeln. Aus dieser Datei ("links.xml")
Code:
<?xml version="1.0"?>
<?xml-stylesheet href="links.xsl" type="text/xsl"?>
<links>
  <link href="http://www.delphipraxis.net">Delphi-PRAXiS</link>
  <link href="http://www.delphi-forum.de">Delphi-Forum</link>
  <link href="http://www.csd-software.net">CSD-Software</link>
  <link href="http://www.luckie-online.de">luckie-online</link>
</links>
wird dann XSL-Stylesheet/Transform ("links.xsl")
Code:
<?xml version="1.0"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" encoding="windows-1252"
  doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN" indent="no"/>

<xsl:template match="/">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="links">
  <html>
    <head>
      <title>Links</title>
    </head>
    <body>
      <xsl:if test="count(child::*)&gt;0">
        <table border="0" width="100%" style="border:#000000 1px solid;">
          <xsl:apply-templates/>
        </table>
      </xsl:if>
    </body>
    </html>
</xsl:template>

<xsl:template match="link">
  <xsl:if test="@href!=''">
    <tr><td>
      <a>
        <xsl:attribute name="href"><xsl:value-of select="@href"/></xsl:attribute>
        <xsl:attribute name="target">_blank</xsl:attribute>
        <xsl:apply-templates/>
      </a>
    </td></tr>
  </xsl:if>
</xsl:template>

</xsl:stylesheet>
ein HTML-Dokument. Entweder via IE oder auch mit folgendem Delphi-Code (unter Benutzung des MS-XML-Parsers):
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  xsldoc,
  xmldoc : DomDocument40;
begin
  // XML-Dokument erzeugen, ...
  xmldoc := CoDomDocument40.Create;
  if(xmldoc <> nil) then
  try
    xmldoc.async := true;
    xmldoc.resolveExternals := true;
    xmldoc.preserveWhiteSpace := true;

    // ... & laden
    xmldoc.load('links.xml');

    // XSL-Stylesheet/Transform erzeugen, ...
    xsldoc := CoDomDocument40.Create;
    if(xsldoc <> nil) then
    try
      // ... & laden
      xsldoc.load('links.xsl');

      // XML-Code mit Hilfe der XSL-Datei
      // in HTML-Code transformieren
      ShowMessage(
        xmldoc.transformNode(xsldoc.documentElement)
      );
    finally
      xsldoc := nil;
    end;

  finally
    xmldoc := nil;
  end;
end;

philwo 18. Apr 2004 17:37

Re: Alternative zum MSXML
 
Chris, ruhig Blut! ;)
Nur weil es neu ist, ist es ja nicht schlecht. Ich wette, der Microsoft Parser hat mehr Bugs als OmniXML ;) und okay, wenn einige Features fehlen, dann kann man den Entwickler ja fragen (das ganze sieht nämlich ziemlich aktiv aus). :)
Durchsetzen? Es ist ganz einfach eine andere Implementation eines Standards, eine recht gute würde ich mal sogar sagen, da muss sich nichts durchsetzen. :) Entweder man benutzt das, oder halt den MSXML, oder noch etwas anderes, ich denke mal, alles hat seine Vor- und Nachteile. Nein, man muss den MSXML nicht mitliefern, OmniXML ist davon unabhängig und hat so gesehen nichts damit zu tun, außer, dass es damit quasi Source-Kompatibel ist. :) Das ist für mich irgendwo schon ein ziemliches Argument, immerhin ist das Viech von MS rund 1 MByte groß und wenn ich mein Programm quasi einfach nur neukompilieren muss um eine (schlankere, schnellere, bessere, sonstige ?) Implementierung direkt integriert zu haben, dann ist das doch ziemlich gut, finde ich. :)

Mathias: Ja, scheint so, als wäre der ganze XSL-Kram noch nicht implementiert ... :-/ Naja, ich hab das noch nie benutzt, aber ich schicke dem Entwickler mal eine Mail, ob er plant, das noch einzubauen. :) Zum "Selbercoden" ist das wohl etwas viel, ist ja keine Funktion, die man mal eben so einbauen kann, ...

Philipp

MathiasSimmack 18. Apr 2004 18:10

Re: Alternative zum MSXML
 
Ich hab´s auch bloß durch mein Prüfprogramm bemerkt. Das nehme ich eigentlich, um nach Fehlern zu suchen. Sprich: es lädt die Datei, und der Parser meldet mir dann evtl. Fehler. Und da war noch ein Stückchen Code drin, dass (sofern die XSL-Datei vorhanden war) einen Knoten eben umgewandelt hat.

Ansonsten wär´s mir auch nicht aufgefallen.

Fellmer Lloyd 1. Jun 2004 09:19

Re: Alternative zum MSXML
 
Hallo.

Ich habe eine Frage zu Omnixml: unterstützt der Parser auch DTDs?

Ist vieleicht eine komische Frage, aber ich habe bis jetzt noch keinen XML-parser verwendet, ich kenne nur die Theorie von XML und DTDs (Syntax, Regeln, Formatierung usw.).

Jens Schumann 1. Jun 2004 09:21

Re: Alternative zum MSXML
 
Hallo,
evt findet sich ja dort eine Alternative Destructor

mirage228 1. Jun 2004 09:24

Re: Alternative zum MSXML
 
Zitat:

Zitat von Jens Schumann
Hallo,
evt findet sich ja dort eine Alternative Destructor

Ja, Daniel hat sich das anscheinend auch angeschaut:

Zitat:

Zitat von Kommentar auf [url
www.destructor.de][/url]
Zum Glück habe ich einen Teppich hier in meinem Arbeitszimmer – da bin ich nicht hart aufgeschlagen, als ich vor Erstaunen vom Sessel gefallen bin. ;-) Ihre Komponente ist ja schnell wie der Blitz!

Daniel R. Wolf, Hamburg/Germany

:mrgreen:

mfG
mirage228

Fellmer Lloyd 1. Jun 2004 09:35

Re: Alternative zum MSXML
 
"Non-validating XML parser"
-Bringt das DTD denn noch was? :gruebel:

MathiasSimmack 1. Jun 2004 09:36

Re: Alternative zum MSXML
 
Erstaunlich ...
Daniel bei destructor.de
Teppich ... Arbeitszimmer ... Sessel

Aber Gero ... Jerr... na, also der Typ im Keller, der muss im Keller hausen. :mrgreen:

MathiasSimmack 1. Jun 2004 09:43

Re: Alternative zum MSXML
 
Zitat:

Zitat von Fellmer Lloyd
"Non-validating XML parser"
-Bringt das DTD denn noch was? :gruebel:

Äh, ich kann zwar jetzt nur für MS-XML sprechen, aber der dortige Validator ist ja gleich eingebaut und kostet dich im Prinzip ein Lächeln. Wenn deine XML-Datei eine DTD benutzt, dann reicht bspw. folgendes:
Delphi-Quellcode:
  Memo1.Clear;

  xmldoc.load(FileListBox1.Items[FileListBox1.ItemIndex]);

  if(xmldoc.parseError.errorCode <> 0) then
  begin
    Memo1.Lines.LoadFromFile(
      FileListBox1.Items[FileListBox1.ItemIndex]
    );

    MessageDlg(Format('%s in Zeile %d, Position %d' + #13#10 + '%s',
      [xmldoc.parseError.reason,xmldoc.parseError.line,
       xmldoc.parseError.linepos,xmldoc.parseError.srcText]),
      mtError,[mbOk],0);
  end
  else
  begin
    Memo1.Lines.Text := xmldoc.xml;
    MessageDlg('Alles okay',mtInformation,[mbOk],0);
  end;
um Fehler zu finden.

Wenn dein XML-Dokument keine DTD benutzt, bzw. wenn es nicht deins ist, du es aber dennoch gern prüfen würdest, dann geht das bspw. mit einer externen XSD-Datei. Hier ein etwas größerer Auszug:
Delphi-Quellcode:
  // create XSD schema
  xsd := CoXMLSchemaCache40.Create;
  if(xsd = nil) then
  begin
    MessageBox(self.Handle,
      pchar(NOXMLPARSER),
      nil,
      MB_OK or MB_ICONEXCLAMATION);

    fErrorExit := true;
    Application.Terminate;
    exit;
  end;
  xsd.add('',ExtractFilePath(paramstr(0)) + 'MO.xsd');

  // try to create a XML parser
  xmldoc := CoDOMDocument40.Create;

  xmldoc.async           := false;
  xmldoc.resolveExternals := true;
  xmldoc.validateOnParse := true;

  // XSD-Schema zuweisen
  xmldoc.schemas         := xsd;

  xmldoc.load(fSavePath + '\' + DATABASE_FNAME);

  // errors while loading, uh-oh, ... :o(
  if(xmldoc.parseError.errorCode <> 0) then
  begin
    if(MessageBox(self.Handle,pchar(
      Format(XMLDATABASEERROR,[xmldoc.parseError.reason,
        xmldoc.parseError.errorCode,xmldoc.parseError.line,
        xmldoc.parseError.linepos,xmldoc.parseError.srcText])),
      nil,
      MB_YESNO or MB_ICONQUESTION) = IDNO) then
    begin
      fErrorExit := true;
      Application.Terminate;
      exit;
    end;

    xmldoc.loadXML('<?xml version="1.0"?><' + mainnode + '/>')
  end;
Der Rest läuft dann wieder wie gehabt: Sind Fehler drin, werden die angezeigt.

Ansonsten müsstest du noch mal fragen, wenn du speziell etwas zum Thema Validieren wissen willst.

Robert Marquardt 1. Jun 2004 10:04

Re: Alternative zum MSXML
 
Ich moechte hier noch OpenXML in den Ring werfen.
http://www.philo.de/xml/

Fellmer Lloyd 1. Jun 2004 10:05

Re: Alternative zum MSXML
 
Danke für die Erläuterung.
Ich wollte eigetlich nur wissen, ob Omnixlm diese Validation auch unterstützt.
Daher mein Zitat :)

MathiasSimmack 1. Jun 2004 13:53

Re: Alternative zum MSXML
 
Zitat:

Zitat von Robert Marquardt
Ich moechte hier noch OpenXML in den Ring werfen.

Mach doch mal ein Beispiel, @Robert. Ein Links zu einem Tutorial im Web (oder dergleichen) tut´s notfalls auch. Ich habe OpenXML mal auf dem falschen Fuß erwischt. ;) Mir hat´s gereicht, dass ich das nicht einfach benutzen konnte, sondern dass ich zuvor noch diese andere Bibliothek installieren musste.

Und wie sieht´s aus bei Konsolen- und nonVCL-Programmen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:07 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