Seite 5 von 8

Verfasst: 18.01.2005 00:20
von Kiffi
> Ich fänds übrigens auch besser (hoffe, das löst jetzt keinen
> Glaubesnkrieg aus) kürzere Funktionsnamen zu haben, z.B.
> XML_funktion()

das würde aber unweigerlich zu Konflikten führen, wenn sich nun jemand
entschliesst, eine Lib mit Funktionen gleichen Namens zu schreiben.

Beispielsweise kann ich eine solche Benennung nicht mehr verwenden,
wenn ich mir demnächst die VBScript-Funktionalität vornehmen werde.
Damit würde ich mit der Lib von Flo kollidieren.

Die Namensgebung 'PT_MSXML3_*' ist relativ eindeutig, hat aber auch den
Nachteil, daß Funktionsnamens-Monster wie PT_MSXML3_AttributesGetNamedItem()
zustande kommen. Aber dank jaPBe ist das Schreiben solcher Ungetüme ja
ziemlich komfortabel. ;)

PT steht für Peter Tübben; MSXML3 für die DLL, die ich wrappe (sollte ich
mich irgendwann entschliessen, die MSXML6 zu wrappen, so werden die
Funktionen dementsprechend benannt.)

Grüße ... Kiffi

Verfasst: 19.01.2005 15:05
von derRaab
:allright: Mein Kompliment. Bei mir läuft es sauber.

Tabstopps und Zeilenumbrüche einzufügen, wenn man eine XML-Datei editorfreundlich abspeichern will, hast Du vermutlich nicht ins Auge gefasst. :)

Vielleicht kann ich mich da anbieten die Funktion umzusetzen, sofern sich das recht einfach in die die Speicherfunktion implementieren lässt?

:mrgreen:

Verfasst: 19.01.2005 16:20
von derRaab
Ich habe eine Frage zu PT_MSXML3_ReleaseObject.

Wenn ich das folgende Codebeispiel ausführe, was ist dann mit dem lItemNode-Parameter in der Prozedur. Wie kann ich den Speicher wieder freigeben?

Oder wird das durch die Zeile

Code: Alles auswählen

PT_MSXML3_ReleaseObject(lTheItemNode)
automatisch mit erledigt?

Das ist mir nicht klar.

Code: Alles auswählen

; Kleiner Test mit Kiffis (www.pure-board.de) XML-Parser LIB
;
;
; globales XML-Dokument
Global XMLDOMDoc

Procedure GetItemNode()
   ; liefert den Item-Knoten aus der XML-Struktur zurück
   
   ; lokale Variable innerhalb der Funktion
   Protected lItemNode.l
   
   ; Node auslesen aus Struktur
   lItemNode = PT_MSXML3_SelectSingleNode(XMLDOMDoc, "glossaryitem/item")
   
   ; Knoten zurückliefern
   ProcedureReturn lItemNode
   
EndProcedure

If OpenConsole()

   ; Objektinstanz erstellen
   XMLDOMDoc = PT_MSXML3_CreateDomDocument()
   
   ; Inhalt in XML-Objekt parsen
   PT_MSXML3_LoadXML(XMLDOMDoc, "<?xml version='1.0' encoding='utf-8'?><glossaryitem><item/></glossaryitem>")

   ; Variable dieser Ebene
   lTheItemNode.l

   ; in diese Variable den Item-Knoten ablegen
   lTheItemNode.l = GetItemNode()

   ; Knoten ausgeben
   MessageRequester("TRACE", PT_MSXML3_GetXml(lTheItemNode))

   ; Speicher wieder frei geben
   PT_MSXML3_ReleaseObject(lTheItemNode)
   PT_MSXML3_ReleaseObject(XMLDOMDoc)

   ; Konsole schließen
   CloseConsole()
EndIf

Verfasst: 19.01.2005 21:08
von Kiffi
> Mein Kompliment.

danke für die Blumen. :)

> Ich habe eine Frage zu PT_MSXML3_ReleaseObject.
> [...]

Wenn Du ein Objekt erstellst (z.B. bei CreateDocument()) bekommst Du
einen Pointer auf die Adresse, an der sich das Objekt im Speicher befindet.
Mit ReleaseObject() gibst Du das Objekt an der übergebenen Speicherstelle
wieder frei.

Mit SelectSingleNode() in Deinem Beispiel funktioniert das genauso. Hier
wird ein Node-Objekt erstellt und dessen Anfangsadresse zurückgegeben,
mit deren Du dann das Node-Objekt wieder aus dem Speicher entfernen
kannst (PT_MSXML3_ReleaseObject(lTheItemNode)).

> Tabstopps und Zeilenumbrüche einzufügen, wenn man eine XML-Datei
> editorfreundlich abspeichern will, hast Du vermutlich nicht ins Auge
> gefasst.

ja, das hat mir auch schon einiges an Kopfzerbrechen bereitet. Es gibt
mehrere Methoden für die XML-Formatierung:

Zum einen kann man ein entsprechend gestaltetes XML-Stylesheet (XSL)
verwenden, um das DomDocument zu transformieren (PT_MSXML3_TransformNode()
oder die entsprechenden *special*-Funktionen). Wenn man im Internet ein
wenig herumsucht, scheint das wohl die geläufigste Methode zu sein.
Nachteile: Bei sehr grossen DomDocumenten kann das schon mal ein
wenig dauern und: Es funktioniert nicht immer. :? Leider habe ich noch
nicht herausfinden können, woran das liegt. Auf jeden Fall lässt sich das
auch bei geläufigen XML-Editoren mit Transformationsmöglichkeiten
nachvollziehen (XML-Spy, CookTop, etc.)

Zum anderen gibt es die Möglichkeit, an entsprechenden Stellen im
DomDocument Text-Elemente (#CrLf$ und #Tab$) einzufügen. Eine
VB-Implementation habe ich mir schon angeschaut, die ich dann in PB
überführen möchte.

Ich arbeite dran :)

Grüße ... Kiffi

Verfasst: 20.01.2005 11:48
von derRaab
Speicherbelegung:
Alles klar, kapiert! Danke für die kurze Einführung!

XML-Speicherung:
Ich würde auf jeden Fall eine Lösung favorisieren, die beim Abspeichern des XML-Objektes via Tabs und Zeilenumbrüchen den reinen Text in der gespeicherten XML-Datei schön formatiert. Dadurch kann man auch mit dem kleinsten Editor (z. B. Notepad) schnell damit weiterarbeiten und evtl. manuell Ergänzungen oder Änderungen vornehmen.

Macht echt Spaß das Ding...



:mrgreen:

Verfasst: 20.01.2005 22:43
von bluejoke
ich würde die Lösung mit Tabs auch favorisieren, in den meisten erweiterten Editoren kann man ja die Tabstopplängen einstellen.

Verfasst: 21.01.2005 10:47
von Kiffi
Hallo,

versucht mal folgenden Code zum Formatieren der XML-Dateien. Ist ein
schneller Hack, der die Zeit bis zum nächsten Lib-Release ein wenig
überbrücken soll ;)

Wichtig! Funktioniert wg. der PB-String-Einschränkung nur mit
XML-Dateien, die kleiner als 64 Kb sind.


Grüße ... Kiffi

Code: Alles auswählen

sXSL.s
sXSL = "<?xml version=" + Chr(34) + "1.0" + Chr(34) + " encoding=" + Chr(34) + "ISO-8859-1" + Chr(34) + "?>" 
sXSL + "<xsl:stylesheet version=" + Chr(34) + "1.0" + Chr(34) + " xmlns:xsl=" + Chr(34) + "http://www.w3.org/1999/XSL/Transform" + Chr(34) + ">"
sXSL + "<xsl:output method=" + Chr(34) + "xml" + Chr(34) + " encoding=" + Chr(34) + "ISO-8859-1" + Chr(34) + "/>"
sXSL + "<xsl:strip-space elements=" + Chr(34) + "*" + Chr(34) + "/>"
sXSL + "<xsl:template match=" + Chr(34) + "/" + Chr(34) + ">    <xsl:apply-templates/></xsl:template>"
sXSL + "<xsl:template match=" + Chr(34) + "node()" + Chr(34) + "><xsl:copy-of select=" + Chr(34) + "." + Chr(34) + "/></xsl:template>"
sXSL + "</xsl:stylesheet>"

; XSL-DomDocument
xXSL = PT_MSXML3_CreateDomDocument()
PT_MSXML3_LoadXML(xXSL, sXSL)

; XML-DomDocument
xXML = PT_MSXML3_CreateDomDocument()
PT_MSXML3_Load(xXML, "C:\source.xml")
PT_MSXML3_LoadXML(xXML, ReplaceString(PT_MSXML3_GetXml(xXML), "><", ">" + #CRLF$ + "<"))

; Transformieren
PT_MSXML3_TransformNode(xXML, xXSL)

; Speichern
PT_MSXML3_Save(xXML, "C:\target.xml")
  
; Freigeben
PT_MSXML3_ReleaseObject(xXSL)
PT_MSXML3_ReleaseObject(xXML)

Verfasst: 07.03.2005 14:55
von derRaab
Hallo Kiffi,

ich wollte mich noch mal erkundigen, ob Du jetzt eine neuere Speichermethode mit Tabs und Zeilenumbrüchen realisiert hast?

Das würde mir zu meinem Glück noch fehlen.

Bis bald

Verfasst: 14.03.2005 12:55
von Kiffi
> ich wollte mich noch mal erkundigen, ob Du jetzt eine neuere
> Speichermethode mit Tabs und Zeilenumbrüchen realisiert hast?

sorry, dass ich mich erst jetzt melde, aber leider hatte ich noch keine Zeit
mich mit dem Problem zu beschäftigen.

ByTheWay: Wenn es von allgemeinen Interesse ist, könnte ich den Source
meiner Lib veröffentlichen (für diejenigen, die ungern mit Libs arbeiten und
lieber den Code includieren möchten).

Grüße ... Kiffi

Verfasst: 15.03.2005 11:14
von derRaab
Na ich hätte nichts dagegen.

Vielleich kann ich dann ja die Funktionalität selbst umsetzen...

Danke