AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein XML Delphi LibXML2 und LibXSLT Einsetzen
Thema durchsuchen
Ansicht
Themen-Optionen

LibXML2 und LibXSLT Einsetzen

Ein Thema von Assertor · begonnen am 9. Nov 2007 · letzter Beitrag vom 14. Apr 2009
Antwort Antwort
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#1

LibXML2 und LibXSLT Einsetzen

  Alt 9. Nov 2007, 09:52
Hallo,

sicher kennen einige von Euch die Delphi Portierung zu LibXSLT.

Ich möchte ein XML mit einem XSLT durch den libXSLT Parser jagen. Aber komplett im Speicher, ohne Temp-File, per T(Tnt)MemoryStream. Mich interessiert auch die Fehlerbehandlung, ich möchte nicht einfach einen leeren MemoryStream von der DLL zurückbekommen, sondern wissen, ob es klappte oder wenn nicht, wo es hakte.

Gibt es dazu irgendwo Tutorials?

Falls jemand LibXSLT für Pascal nicht kennt: Zu finden z.B. bei SourceForge
libXML2
oder bei einem anderen Maintainer:
http://www.zlatkovic.com/libxml.en.html

Es gibt zusätzlich ja auch einen Port von Delphi Inspiration, diXML. Wobei ich nicht mich wundere, daß dort für einen 1:1 Port von OpenSource C in ObjectPascal über 200,- Euro zzgl. MWSt. fällig werden... Vielleicht hat Herr Junker auch noch mehr integriert, aber ich kann mit DLLs leben.

Gruß winkel79
Frederik
  Mit Zitat antworten Zitat
Benutzerbild von fs999
fs999

Registriert seit: 4. Dez 2006
Ort: Luxembourg
46 Beiträge
 
Delphi 10.3 Rio
 
#2

Re: LibXML2 und LibXSLT Einsetzen

  Alt 9. Nov 2007, 10:06
Hallo,

Vielleicht kann das hier dir auch helfen. Ich benutze MsXml2 mit strings als input und output :

Delphi-Quellcode:
uses MSXML2_TLB;

function Transform(Xml, Xsl: String): String;
var
  XMLDoc : IXMLDOMDocument;
  XSLDoc : IXMLDOMDocument;
  Template : IXSLTemplate;
  Processor : IXSLProcessor;
begin
  Result := '';
  try
    XMLDoc := CoFreeThreadedDOMDocument60.Create;
    XSLDoc := CoFreeThreadedDOMDocument60.Create;
    XMLDoc.LoadXML(Xml);
    XSLDoc.LoadXML(Xsl);
    Template := CoXSLTemplate60.Create;
    Template.StyleSheet := XSLDoc;
    Processor := Template.CreateProcessor;
    Processor.Input := XMLDoc;
    Processor.Transform;
    Result := Processor.Output;
  finally
    XMLDoc := nil;
    XSLDoc := nil;
    Template := nil;
    Processor := nil;
  end;
end;
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#3

Re: LibXML2 und LibXSLT Einsetzen

  Alt 9. Nov 2007, 13:44
Hi fs999,

danke der Ansatz ist gut, eine leichte Vermischung der MSXML Versionen ist da aber drin, oder? Oben MSXML2 und unten DomDocument60?

Ich versuche eine Microsoft-Unabhängige Lösung zu realisieren, daher das libXSLT. Das geht unter Win98 bis Vista, ohne irgendwelche MS XML Update SP2 für 4 (deprecated) oder MS XML 6 etc.pp.

Falls jemand libXSLT kennt wäre ich für ein kurzes Brainstorming dankbar.

Gruß Assertor
Frederik
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: LibXML2 und LibXSLT Einsetzen

  Alt 9. Nov 2007, 14:48
Hallo,

hast du dir schon die Demo SimpleXSLT angesehen?

Wegen der Fehlerbehandlung würde ich mir mal den TransformContext genauer betrachten.

Grüße vom marabu
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#5

Re: LibXML2 und LibXSLT Einsetzen

  Alt 9. Nov 2007, 16:23
Hi marabu,

danke für den Denkanstoß. Ich bin die ganze Zeit mit der mdhLibxml2.pas von Martin Holmes an die Sache gegangen und hab die Demos mir nicht weiter angesehen...

Der Context stimmt, aber ich muß die xyzFunctionToFromFileName in den Funktionsaufrufen natürlich ersetzen. Mal sehen, wie ich dann das Errorhandling hinbekomme.

Danke für Deine, wie immer, schnelle und gute Antwort!

Gruß Assertor
Frederik
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#6

Re: LibXML2 und LibXSLT Einsetzen

  Alt 10. Nov 2007, 16:40
So, Kommando zurück.

So gut helfen mir die Beispiele nicht, denn sie behandeln nur die Dateioperationen für XML Parsing und XSLT Transformation.

Ich finde nicht, wie ich z.B. das XSLT Result in einem String erhalten kann.

Der Funktionsaufruf lautet

xsltSaveResultToString(doc_txt_ptr: xmlCharPtrPtr; doc_txt_len: PInteger; result: xmlDocPtr; style: xsltStylesheetPtr); Ich übergebe als Result testhalber das xml Document mit dem korrekt angewandeten Stylesheet und als style das korrekt geparste Stylesheet. Das geht. Es klappt auch beim direkten Speichern in eine externe Datei.

Aber wie kann ich einen xmlCharPtrPtr und den zugehörigen PInteger verwenden. Mangels libxml2.pas Doku interpretiere ich den doc_txt_len als Rück-Übergabe der Länge des Zieldokuments und den doc_txt_ptr als Zeiger auf das Dokument.

Ich habe spaßeshalber mal ein zugewiesenes ByteArray ausprobiert, mal einen (Ansi)String, mal einen Zeiger auf einen WideString. Ist ja nur lokal innerhalb einer Funktion. Aber das führt alles zu einer External Exception in der libxslt.dll.

Da wird wohl etwas anderes erwartet...

Hat jemand eine Idee?

Gruß Assertor
Frederik
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#7

Re: LibXML2 und LibXSLT Einsetzen

  Alt 10. Nov 2007, 16:43
Nachtrag,

in den Docs zu libxslt steht der Funktionsaufruf so drin:
Delphi-Quellcode:
Function: xsltSaveResultToString

int   xsltSaveResultToString      (xmlChar ** doc_txt_ptr,
                int * doc_txt_len,
                xmlDocPtr result,
                xsltStylesheetPtr style)

Save the result @result obtained by applying the @style stylesheet to a new allocated string.
doc_txt_ptr:   Memory pointer for allocated XML text
doc_txt_len:   Length of the generated XML text
result:   the result xmlDocPtr
style:   the stylesheet
Returns:   0 in case of success and -1 in case of error
So ganz verstehe ich es nicht, denn das Stylesheet wurde ja bereits auf das XML angewandt. Dies geschieht, wie in den Demos, durch xsltresult := xsltApplyStylesheet(xslt, doc, Params);
Frederik
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#8

Re: LibXML2 und LibXSLT Einsetzen

  Alt 10. Nov 2007, 17:28
Also, ich probiere es jetzt so:

Delphi-Quellcode:
var
  doc: xmlDocPtr;
  xslt: xsltStylesheetPtr;
  xsltresult: xmlDocPtr;
  xsltcontext: xsltTransformContextPtr;

  params: ppchar;

  str: WideString;
  pint: PInteger;
  pxmlchar: xmlCharPtr;
  ppxmlchar: xmlCharPtrPtr;
begin
  Result := '';

  xmlInitParser();
  xmlSubstituteEntitiesDefault(1);
  params := nil;

  doc := xmlParseFile(pchar('gruss.xml')); // load and parse xml
  xslt := xsltParseStylesheetFile(pchar('gruss.xsl')); // load and parse xsl
  xsltcontext := xsltNewTransformContext(xslt, doc); // create context
  xsltresult := xsltApplyStylesheet(xslt, doc, Params); // transform

  if (doc <> nil) and (xslt <> nil) and
     (xsltcontext <> nil) and (xsltresult <> nil) then
  begin
    str := '';

    pxmlchar := @str;
    ppxmlchar := @pxmlchar;

    New(pint);
    xsltSaveResultToString(ppxmlchar, pint, xsltresult, xslt);
    Dispose(pint); // Größe wird nicht weiter benötigt

    Result := str;
  end;
Parser-Cleanup am Ende soll jetzt erstmal egal sein: FreeTransformContext etc. kommen später.

Es geht schon mal soweit, daß keine AV mehr kommt. Für einen lokalen PInt einen Integer zu definieren war mir zu blöd, daher die New/Dispose Geschichte.

Problem: str ist nach xsltSaveResultToString leer. Da hab ich doch irgendwo Bockmist mit den Pointern - nur ich sehs im Moment nicht.

Kann denn keiner Helfen <- ich liebe diesen Spruch

Gruß Assertor
Frederik
  Mit Zitat antworten Zitat
Sergej_Molotov

Registriert seit: 18. Jul 2006
61 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: LibXML2 und LibXSLT Einsetzen

  Alt 14. Apr 2009, 09:56
Falls es noch interessiert:

Koders Code Search
Thomas
  Mit Zitat antworten Zitat
Antwort Antwort


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 18:19 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