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>