Seite 1 von 2
MSXML
Verfasst: 09.08.2006 11:29
von Tafkadasom2k5
Hallo Allerseits!
Ich habe zwar schon diverse Diskussionen hier gelesen, werde aber nicht daraus schlau.
Ich brauche einen recht einfachen XML Parser, oder zumindest ein paar Ansätze, wie man so einen programmieren könnte.
Nun habe ich mitlerweile die MSXML.DLL installiert und auch eine entsprechende include gefunden, um die Befehle "aus dem Bauch raus" nutzen zu können
Nur komme ich mit dioeser DLL nicht wirklich klar.
Kann mir jemand (zu Kiffi schiel

) einen Grundcode posten, wie ich mich durch die einzelnen Nodes forste?
Gr33tz
Tafkadasom2k5
Verfasst: 09.08.2006 12:35
von Thorsten1867
Habe mal kurz eine Procedure aus meinem Programm herauskopiert und ein bisschen vereinfacht. Vielleicht hilfts ja weiter:
Code: Alles auswählen
Procedure.s ParseXML(XMLFile$)
If FileSize(XMLFile$) <= 0 ; Überprüfen, ob Datei existiert
MessageRequester(" ParseXML (Maske)", "Die Datei '"+XMLFile$+"' ist nicht vorhanden.", #MB_OK|#MB_ICONERROR)
ProcedureReturn
EndIf
oDoc = MSXML3_CreateDomDocument() ; DOM-Objekt initialisieren
If oDoc
If MSXML3_Load(oDoc, XMLFile$) ;XML-File laden
oMaske = MSXML3_SelectSingleNode(oDoc, "maske") ; Attribute von <maske> auswerten
If oMaske
oAttrList = MSXML3_GetAttributes(oMaske)
If oAttrList
name$ = MSXML3_AttributesGetText(MSXML3_AttributesGetNamedItem(oAttrList, "name"))
comment$ = MSXML3_AttributesGetText(MSXML3_AttributesGetNamedItem(oAttrList, "comment"))
page$ = MSXML3_AttributesGetText(MSXML3_AttributesGetNamedItem(oAttrList, "page"))
din$ = MSXML3_AttributesGetText(MSXML3_AttributesGetNamedItem(oAttrList, "din"))
border$ = MSXML3_AttributesGetText(MSXML3_AttributesGetNamedItem(oAttrList, "border"))
mtyp$ = MSXML3_AttributesGetText(MSXML3_AttributesGetNamedItem(oAttrList, "typ"))
protect$ = MSXML3_AttributesGetText(MSXML3_AttributesGetNamedItem(oAttrList, "protect"))
exc$ = MSXML3_AttributesGetText(MSXML3_AttributesGetNamedItem(oAttrList, "exc"))
MSXML3_ReleaseObject(oAttrList)
EndIf
; --------------------------
; Header-Daten auswerten
; -------------------------
EndIf
; ========== Seiten auslesen ==========
oSeiteList = MSXML3_GetChildNodes(oMaske) ; Node mit alle Seiten
MSXML3_ReleaseObject(oMaske)
If oSeiteList
For s = 0 To MSXML3_NodeListGetLength(oSeiteList) - 1
oSeite = MSXML3_NodeListNextNode(oSeiteList)
;{ Attribut Seiten-Nr. auslesen
oAttrList = MSXML3_GetAttributes(oSeite)
If oAttrList
nr$ = MSXML3_AttributesGetText(MSXML3_AttributesGetNamedItem(oAttrList, "nr")) ; Seitennummer
MSXML3_ReleaseObject(oAttrList)
EndIf ;} -----------------------------
; ========== Definitionen der Seite auswerten ==========
oMaskDefList = MSXML3_GetChildNodes(oSeite) ; Node der aktuellen Seite (s)
MSXML3_ReleaseObject(oSeite)
For d = 0 To MSXML3_NodeListGetLength(oMaskDefList) - 1 ; Definitionen dieser Seite auslesen
oMaskDef = MSXML3_NodeListNextNode(oMaskDefList)
; ----------------------------------------------------------------
Type$ = MSXML3_GetNodeName(oMaskDef)
oAttrList = MSXML3_GetAttributes(oMaskDef) ; Attribute der Maskendefinition
If oAttrList
x.f = ValF(MSXML3_AttributesGetText(MSXML3_AttributesGetNamedItem(oAttrList, "x")))
y.f = ValF(MSXML3_AttributesGetText(MSXML3_AttributesGetNamedItem(oAttrList, "y")))
w.f = ValF(MSXML3_AttributesGetText(MSXML3_AttributesGetNamedItem(oAttrList, "w")))
h.f = ValF(MSXML3_AttributesGetText(MSXML3_AttributesGetNamedItem(oAttrList, "h")))
If Type$<>"linie" And Type$<>"bmark" ;Attribute für Typ 'line'
format$ = MSXML3_AttributesGetText(MSXML3_AttributesGetNamedItem(oAttrList, "format"))
font$ = MSXML3_AttributesGetText(MSXML3_AttributesGetNamedItem(oAttrList, "font"))
opt$ = MSXML3_AttributesGetText(MSXML3_AttributesGetNamedItem(oAttrList, "opt"))
Else ; andere Typen
format$ = ""
font$ = ""
opt$ = ""
EndIf
defmask$ = MSXML3_GetText(oMaskDef)
; --------------------------
; Seiten-Daten auswerten
; -------------------------
MSXML3_ReleaseObject(oAttrList)
EndIf
Next ; nächste Masken-Definition
; =============================================
MSXML3_ReleaseObject(oMaskDef)
MSXML3_ReleaseObject(oMaskDefList)
Next ; nächste Seite
MSXML3_ReleaseObject(oSeiteList)
EndIf
Else ; Fehler beim Parsen
;msg$ = "ErrorCode: " + Str(MSXML3_GetParseErrorErrorcode(oDoc)) + #CRLF$
msg$ = "Beschreibung: " + MSXML3_GetParseErrorReason(oDoc) + #CRLF$
msg$ + "Source: " + MSXML3_GetParseErrorSrctext(oDoc) + #CRLF$
msg$ + "Fehlerzeile: " + Str(MSXML3_GetParseErrorLine(oDoc)) + #CRLF$
msg$ + "Fehlerposition: " + Str(MSXML3_GetParseErrorLinepos(oDoc)) + #CRLF$
MessageRequester(" Fehler in der Maskendefinition (XML)", msg$)
MSXML3_ReleaseObject(oDoc)
ProcedureReturn "error"
EndIf
MSXML3_ReleaseObject(oDoc)
Else
MessageRequester("Initialisierung fehlgeschlagen", "Es konnte kein DOMDocument-Objekt erstellt werden")
EndIf
ProcedureReturn protect$
EndProcedure
Das dazugehörige XML-Document:
Code: Alles auswählen
<?xml version='1.0' encoding='iso-8859-1' standalone='yes'?>
<maske name='Adressliste' comment='Liste mit Adressdaten der Schüler' page='P' din='A4' border='15|15|15|15' typ='L' protect='yes'>
<seite nr='1'>
<tzeile x='15.00' y='15.00' w='50.00' h='10.00' format = 'C' font='14|Arial|B' opt='1|0|1|224'>Schülername, Straße, Telefonnummern</tzeile>
<table x='15.00' y='25.00' w='50.00' h='8.00' format = 'L' font='11|Arial|' opt='1|0|0|224'>
$VName $Name, $Str, $Tel / $Tel2
</table>
</seite>
</maske>
Verfasst: 09.08.2006 13:39
von Tafkadasom2k5
Ahhhhh, super, damit werde ich erstmal experimentieren um die Grundfunktionalitäten zu schnallen!
Super
Gr33tz
Tafkadasom2k5
Edit:
Kurze Frage:
Von welchem Typ sind die Variablen mit dem "O" Prefix?
Also welche Structures? Ich muss sie ja irgendwie vordefinieren...
Edit2: Und die MSXML3_CreateDomDocument() Procedure finde ich nirgendwo in der "MSXML3.Inc"...
Verfasst: 09.08.2006 16:51
von bluejoke
Die Library unter PBOSL hast du aber schon gesehen? Ich dachte da wäre eine Hilfa dabei gewesen, incl. Beispielen, bin mir aber nicht sicher.
EDIT: Ich mein natürlich
MSXML3 Kiffi [Windows] Wrapper for the msxml3.dll from Microsoft to use xml-functionalities from PB
http://pbosl.purearea.net/
Verfasst: 09.08.2006 16:56
von Thorsten1867
Falls es nicht klar wurde, mein Beispiel basiert auf PBOSL.
Verfasst: 09.08.2006 17:00
von bluejoke
Oh, das hab ich mir gar nicht angesehen, tut mir leid.
Verfasst: 09.08.2006 17:03
von Tafkadasom2k5
Thorsten1867 hat geschrieben:Falls es nicht klar wurde, mein Beispiel basiert auf PBOSL.
Ach...deshalb..
Ich habe die ganze Zeit versucht das mit MSXML3 zu erledigen und wundere mich darüber, dass es nicht funktioniert...
..hat denn niemand Erfahrung mit dieser DLL?
Danke aber für Eure Bemühungen vorerst!
Gr33tz
Tafkadasom2k5
Verfasst: 09.08.2006 17:06
von bluejoke
Kiffi hat natürlich Ahnung, er hat ja die Library geschrieben. Lade dir am besten den Sourcecode der Library herunter und schaue dir den genau an.
Verfasst: 09.08.2006 17:06
von Thorsten1867
Tafkadasom2k5 hat geschrieben:Kurze Frage:
Von welchem Typ sind die Variablen mit dem "O" Prefix?
Also welche Structures? Ich muss sie ja irgendwie vordefinieren...
Edit2: Und die MSXML3_CreateDomDocument() Procedure finde ich nirgendwo in der "MSXML3.Inc"...
Die Variablen mit "o" sind DOM-Objekte.
Für mein Beispiel brauchst du die entsprechende Libary aus PBOSL, 'MSXML3.inc' kenne ich nicht. Die dazugehörige Hilfedatei in Vebindung mit dem Beispiel ist eine Lektüre wert.
Verfasst: 09.08.2006 17:09
von Thorsten1867
Tafkadasom2k5 hat geschrieben:Ich habe die ganze Zeit versucht das mit MSXML3 zu erledigen und wundere mich darüber, dass es nicht funktioniert...
PBOSL enthält einen Wrapper für MSXML3 (DLL) und dürfte dir einige Arbeit erleichtern.