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 :allright:

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.