AGB  ·  Datenschutz  ·  Impressum  







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

Mal ´n bisschen XML

Ein Thema von MathiasSimmack · begonnen am 18. Aug 2002 · letzter Beitrag vom 23. Aug 2002
Antwort Antwort
MathiasSimmack
(Gast)

n/a Beiträge
 
#1

Mal ´n bisschen XML

  Alt 18. Aug 2002, 17:13
Hi Leute.

Ich habe ein paar kleine Fragen, weil ich mich (gezwungenermaßen!) erst seit letztem Freitag mit dem Thema XML beschäftige. Also, grundlegende Probleme mit der XML-Syntax und dem Aufbau usw. habe ich nicht. Ich habe die Typenbibliothek Microsoft XML, v3.0 importiert, und damit lässt sich ja schön einfach arbeiten. Was ich aber wissen möchte:


1. Wie müsste eine Sicherheitsfunktion aussehen, die das Programm beendet, wenn auf dem Zielrechner kein MS-XML v3.0 möglich ist. Kann ja durchaus passieren. Meine Idee wäre, dass ich dynamisch die Bibliothek "msxml3.dll" lade und bei einem Fehler das Programm entsprechend abbreche. Denn: wenn die DLL nicht vorhanden, dann wird´s auch nix mit XML? Ist das ein guter Gedanke, oder wie wäre es richtig?

2. Wie steht´s mit dem Zeilenumbruch? Ich habe bemerkt, dass mein XML-Dokument eine lange Zeile ist. An sich nicht schlimm, aber prompt kam´s zu einem Problem bei dem Programm, dass auch auf die XML-Datei zugreifen muss. Ich behelfe mir momentan so, dass ich den XML-Code via "StringReplace" bearbeite. Will sagen: wenn ">" gefunden, dann mach ein ">#13#10" draus. - Da wäre natürlich auch eine einfachere Idee genial, denn "StringReplace" kostet ein bisschen Zeit.

3. Grandios ist das Problem: ich muss auf eine XML-Datei zugreifen, die nicht von mir ist. Es ist auch leider nicht möglich, diese Datei zu ignorieren und von Null anzufangen. Aus Versehen oder auch absichtlich wurden in dieser XML-Datei die numerischen Attribute allerdings ohne Anführungszeichen gespeichert:

Code:
<FalscherTag value=1234/>
Laut XML-Syntax wäre aber

Code:
<RichtigerTag value="1234"/>
korrekt. Da der XML-Parser deswegen meckert, lade ich die Datei erst mal zeilenweise in ein String-Array, ergänze notfalls die Anführungszeichen und gebe sie dann erst an mein "DOMDocument" weiter. Geht das vielleicht auch einfacher und schneller?

4. Und generell: wie sieht eigentlich der korrekte Initialisierungscode aus? Ich habe dutzende Varianten im Web gesehen und mich erst mal für diese Variante entschieden:
Code:
[b]if[/b](CoInitialize([b]nil[/b]) = S_OK) [b]then[/b]
  [b]try[/b]
    xmldoc := CoDOMDocument.Create;
    [color=#000080][i]// usw.[/i][/color]
  [b]finally[/b]
    [color=#000080][i]// CoUninitialize;[/i][/color]
  [b]end[/b];
Das "CoUninitialize" musste ich z.B. ausklammern, weil´s beim Start von der Konsole (es soll auch nur Kommandozeilenprogramm bleiben!) regelmäßig Zugriffsverletzungen gab. Wer weiß, welche Variante richtig ist?


Wen der Hintergrund noch interessiert:

Nach über 2 Monaten hat sich Microsoft nun entschieden, mir die Genehmigung zur Benutzung zweier Tools nicht zu geben. Da ich die aber gebraucht hätte, um sog. "HTML Help Collections" (das PSDK ist eine solche!) zu erstellen, muss ich mir die XML-Tools nun selbst schreiben. Ich bin inzwischen auch fertig.
Gestern habe ich spaßeshalber mal mein PSDK de-registriert, und heute - nach Fertigstellung von "regcol.exe" - habe ich meine erste eigene Collection im System registriert. Geht also wunderbar. 8)

Nur die o.g. "Problemzonen" würde ich gern noch ausmerzen, damit die Tools auf möglichst allen Rechnern laufen. Dann steht einer Veröffentlichung inkl. Doku (und vielleicht auch Sourcen) nichts im Weg. Dann kann jeder Interessent eigene Collections zusammenbauen, ohne Microsoft um Erlaubnis fragen zu müssen.

Gruß,
Mathias.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#2
  Alt 18. Aug 2002, 18:25
Moin Mathias,

für das StringReplace Problem hab' ich versucht mal eine schnelle Lösung zu erstellen.
Ist nur ein Muster und, wie ich zugeben muss, ein ungetesteter Schnellschuss
Voraussetzung ist allerdings, dass die Datei auch wirklich nur ein #13#10 enthält, und das als Dateiende.
Allerdings handelt es sich um einen Auszug einer aufwändigeren Routine, die's bei mir tut.

Code:
[b]type[/b]
  TForm1 = [b]class[/b](TForm)
    Button1: TButton;
    [b]procedure[/b] Button1Click(Sender: TObject);
  [b]private[/b]
    [color=#000080]{ Private-Deklarationen }[/color]
    FpFrom  : PChar;
    FpTo    : PChar;
    FsBufIN : [b]string[/b];
    FsBufOUT : [b]string[/b];
  [b]public[/b]
    [color=#000080]{ Public-Deklarationen }[/color]
    [b]procedure[/b] ReplaceGreaterThan;
  [b]end[/b];

[b]var[/b]
  Form1: TForm1;

[b]implementation[/b]

[color=#000080]{$R *.DFM}[/color]

[b]procedure[/b] TForm1.Button1Click(Sender: TObject);

[b]var[/b]
  fsIN : TFileStream;

[b]begin[/b]
  fsIN := TFileStream.Create('C:\MeineDatei.xml',fmOpenRead [b]or[/b] fmShareDenyWrite);
  [b]try[/b]
    FsBufIN := StringOfChar(#00,fsIN.Size);
    FsBufOUT := StringOfChar(#00,fsIN.Size * 2);
    fsIN.Read(FsBufIN[1],fsIN.Size);
  [b]finally[/b]
    FreeAndNil(fsIN);
  [b]end[/b];
  FpFrom := @FsBufIN[1];
  FpTo  := @FsBufOUT[1];
  ReplaceGreaterThan;
[b]end[/b];

[b]procedure[/b] TForm1.ReplaceGreaterThan;
[b]asm[/b]
@@Start:
    [color=#000080]// Register sichern[/color]
    push EDI
    push ESI
    push ESP
    push EBP
    push EBX
    [color=#000080]// Bufferadressen laden[/color]
    mov ESI,self
    mov EDI,self
    mov ESI,[ESI].FpFrom
    mov EDI,[EDI].FpTo
    [color=#000080]// Sicherstellen, das Adressen hochgezählt werden[/color]
    cld
@@mainloop:
    [color=#000080]// Quelle nach Ziel kopieren[/color]
    mov AL,[ESI]
    movsb
    [color=#000080]// Zeilenende erreicht?[/color]
    cmp AL,$0D
    [color=#000080]// Ja, fertig[/color]
    jz @@exit
    [color=#000080]// Zu ergänzendes Zeichen?[/color]
    cmp AL,'>'
    [color=#000080]// Nein, nächstes[/color]
    jnz @@mainloop
    [color=#000080]// sonst #13#10 in den Zielbuffer[/color]
    mov AL,$0D
    mov [EDI],AL
    inc EDI
    mov AL,$0A
    mov [EDI],AL
    inc EDI
    [color=#000080]// weiter[/color]
    jmp @@mainloop
@@exit:
    [color=#000080]// Zeilenende vervollständigen[/color]
    mov AL,$0A
    mov [EDI],AL
    [color=#000080]// Registerinhalte zurückholen[/color]
    pop EBX
    pop EBP
    pop ESP
    pop ESI
    pop EDI
[b]end[/b];
Auf ähnlichem Wege müsste sich auch das Problem mit den numerischen Attributen erledigen lassen. Liesse sich vielleicht noch in die Replace Routine mit einbauen.

Zu 4.
Wenn ich CoInitialize/Uninitialize brauche, mache ich das i.d.R. im initialization/finalization Abschnitt der HauptUnit. Es wird ja einmal pro Thread benötigt.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#3
  Alt 19. Aug 2002, 07:37
Hi Chris.

Dank deiner Anregung habe ich das "CoInitialize(nil)" und das "CoUninitalize" in den Main-Teil meiner Tools geschrieben. Da ich keine Unit benutze, habe ich ja keinen initialization/finalization-Part. Aber so, wie´s jetzt ist, kommt der Zugriffsfehler auch nicht mehr. Das ist schon mal gut.

Und das "StringReplace" habe ich mittlerweile durch eine Funktion ersetzt, die ich mir aus others HTML-Parser abgeguckt habe. Die ist schneller, und das Ergebnis (die formatierte XML-Datei) kann sich auch sehen lassen. Dein Assembler-Ding muss ich mir mal in einer ruhigen Minute angucken.

Das Einlesen der "fehlerhaften" XML-Datei erledige ich jetzt direkt über einen AnsiString, bei dem die Anführungszeichen notfalls ergänzt werden. Das ist auch noch mal einen Tick schneller als der alte Weg über das String-Array usw.


@all:

Tja ... hm ... hat denn irgendwer den Mut, die beiden Tools auf sein System loszulassen? Ich würde eine Mini-Doku (Textdatei) und drei kleine CHM/CHI-Hilfedateien zur Verfügung stellen, damit man was zum Ausprobieren hat. Quasi als Preview der geplanten Dokumentation. Bei mir geht´s nämlich ganz gut. Aber das muss ja nichts heißen.

Gruß,
Mathias.
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#4
  Alt 19. Aug 2002, 12:32
Hi Leute.

Also, wer mir den Gefallen tun und die Geschichte mal testen wollte, der konnte hier () die aktuellen Betas der beiden Tools RegCol und UnRegCol herunterladen. Drei kleine CHM/CHI-Hilfedateien inkl. der notwendigen Angaben für eine Beispiel-Collection waren ebenfalls dabei.

Ich habe außerdem eine LIESMICH.txt reingepackt, in der ich ganz kurz erkläre, wie man die CHM-Hilfedateien kompilieren muss, wenn man solche Collections erstellen will. Kann ja sein, dass ihr es lieber mit euren eigenen CHMs probieren wollt.


ACHTUNG!

Die Benutzung der beiden Tools erfolgt auf eigenes Risiko. Ihr müsst zwar nicht befürchten, dass eure Platte formatiert wird (also, dass das passiert, glaube ich nicht sooo schlecht ist mein Code ja nun auch wieder nicht!), aber mit Fehlern ist leider immer zu rechnen. War mein erstes XML-Experiment. Der schlimmste Bug dürfte in dem Fall aber eigentlich nur sein, dass evtl. die Datei "hhcolreg.dat" ruiniert wird.

Die findet ihr im "Windows/Help"-Ordner (9x) bzw. unter "Dokumente und Einstellungen/All Users/Anwendungsdaten/Microsoft/HTML Help". Ich empfehle daher, vor dem Testen eine Kopie dieser Datei anzulegen, damit ihr hinterher wieder auf eure evtl. schon installierten Collections (MSDN, PSDK) zugreifen könnt.

Wer mit UnRegCol mal eine fremde Collection, das PSDK beispielsweise, de-registrieren will, der sollte dort vorher die COL-Datei sichern, die sich im Ordner mit den ganzen CHMs befindet. Die wird nämlich durch die De-Registrierung gelöscht.


Collection registrieren

Dazu nehmt ihr das Tool RegCol und gebt als Parameter den Ordner mit den CHMs/CHIs an. Der zweite Parameter ist eine Steuerdatei, die Infos über das Inhaltsverzeichnis der Collection enthält. Im Beispiel liegt eine BAT-Datei bei (register.bat), die genau diesen Aufruf übernimmt.
Die o.g. LIESMICH.txt enthält auch ein paar zusätzliche Infos zum Aufbau der Steuerdatei.


Collection de-registrieren

Hier wird UnRegCol benutzt und der Name der erst erzeugten COL-Datei angegeben. Das macht die "unregister.bat" im Beispiel.


Geschichten von Interesse ...
  • Was passiert, wenn die "msxml3.dll" nicht vorhanden ist?
  • Klappt das Registrieren und De-Registrieren auf euren Rechnern? Und wenn möglich sogar unter allen bekannten Betriebssystemen? Getestet habe ich´s unter Win98 und XP. Bei mir ging´s.
  • Bleiben vorhandene Collections (MSDN, PSDK) auch bei euch weiterhin lauffähig? Sollten sie ...
Fehlermeldungen bitte an mich, bzw. hier in diesen Topic rein.


Viel Spaß, fröhliches Probieren und keine Bugs wünscht,
Mathias.
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#5
  Alt 19. Aug 2002, 17:11
Kleine Anmerkung noch. Laut XML-Standard müssen alle Werte der Attribute in "Hochkommata" eingeschlossen werden. Kurz, der MSXML DOM arbeitet korrekt - wäre manchmal aber trotzdem nett, wenn er solche Fehler verzeichen könnte.

Warum nutzt Du nicht den MSXML4 DOM - der ist viel schneller und hat einige interne nette Vorteile
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#6
  Alt 19. Aug 2002, 18:43
Zitat von sakura:
Kleine Anmerkung noch. Laut XML-Standard müssen alle Werte der Attribute in "Hochkommata" eingeschlossen werden.
Das ist mir bekannt, aber sag das Microsoft, bzw. den Entwicklern von "hhcol.exe". Das macht´s bei Strings richtig, nur numerische Attribute schreibt es grundsätzlich ohne Anführungszeichen.

Zitat:
Kurz, der MSXML DOM arbeitet korrekt
Richtig. Und dankbarerweise funktioniert die syntaktisch bearbeitete "hhcolreg.dat" trotzdem noch. Also, vorhandene Collections wie das PSDK starten auch weiterhin usw.

Zitat:
- wäre manchmal aber trotzdem nett, wenn er solche Fehler verzeichen könnte.
Ja, das habe ich mir auch schon gewünscht. Wenn´s eine Option gegeben hätte, solche Syntaxfehler zu ignorieren, dann hätte ich mir nicht die Mühe mit dem extra Einlesen machen müssen.

Zitat:
Warum nutzt Du nicht den MSXML4 DOM - der ist viel schneller und hat einige interne nette Vorteile
Ich hab´s ehrlich gesagt nicht installiert. Ich suche noch nach einem Weg, die MSXML3.DLL zu finden, um während der Installation zu reagieren, wenn sie nicht vorhanden ist. Es gibt da eine Möglichkeit beim MSI, aber da muss ich erst mal durchsteigen.

Aber hat´s denn nun eigentlich geklappt, oder waren das nur theoretische Anmerkungen von dir? Also, hast du´s mal probiert?

Gruß,
Mathias.
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#7
  Alt 19. Aug 2002, 19:50
Zitat von MathiasSimmack:
Aber hat´s denn nun eigentlich geklappt, oder waren das nur theoretische Anmerkungen von dir? Also, hast du´s mal probiert?
Von meiner Seite war es nur ein wenig Theorie. Ich arbeite tag-täglich mit MSXML4 und wollte nur ein wenig Senf hinterlassen.

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#8
  Alt 20. Aug 2002, 05:46
Ich habe nix gegen Senf.

Mal als Frage: hast du auf deinem Rechner noch die "MSXML3.DLL" oder nur die 4er-Version? Das wäre ein weiterer Schwachpunkt, fällt mir gerade so ein.

Oder benutzt so eine Typbibliothek immer die Library, die sich in den Vordergrund drängt? (Im Kommentar meiner TL steht z.B., dass sie aus der o.g. DLL generiert worden ist ...) Hey, das war mein erster Import von so einer TL, deswegen muss/will ich auch mal solche Fragen stellen.

Gruß,
Mathias.
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#9
  Alt 23. Aug 2002, 17:05
Hi.

Ich habe den Download-Link entfernt, weil mein Programm jetzt zu 95% funktioniert. Die fehlenden 5% betreffen die deutschen Umlaute. Da behelfe ich mir gerade mit einer externen Funktion, die nichts mit dem XML-Parser zu tun hat - mal seh´n, ob´s auch einfacher geht.

Ansonsten sind kleine Mini-Bugs entfernt. Und im PSDK habe ich folgendes gefunden:
Zitat von PSDK:
IXMLDOMDocument2

Version-Independent CLSID: F6D90F11-9C73-11D3-B32E-00C04F990BB4
Ich gehe also davon aus, dass auch aktuellere Versionen der XML-Bibliothek von Microsoft mit meinem Tool funktionieren, sofern sie das Interface "IXMLDOMDocument2" unterstützen. Vor der Installation einer Collection kann also geprüft werden, ob die GUID im System bekannt ist (der MSI bietet praktischerweise gleich Funktionen für solche Sachen 8) <-- boah, Schleichwerbung!). Wenn nicht, dann gibt´s ´ne Fehlermeldung des Installers.

So, dann werde ich mich mal an die richtige Doku zu dem Thema machen und dabei die G´schicht´ mit den Umlauten im Kopf behalten.

Gruß,
Mathias.
  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 06:34 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