MSXML

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

MSXML

Beitrag 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
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Benutzeravatar
Thorsten1867
Beiträge: 1360
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag 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>
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag 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"...
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag 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/
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Benutzeravatar
Thorsten1867
Beiträge: 1360
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag von Thorsten1867 »

Falls es nicht klar wurde, mein Beispiel basiert auf PBOSL.
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag von bluejoke »

Oh, das hab ich mir gar nicht angesehen, tut mir leid.
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag 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
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag 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.
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Benutzeravatar
Thorsten1867
Beiträge: 1360
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag 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.
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
Thorsten1867
Beiträge: 1360
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag 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.
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Antworten