Seite 1 von 3

PB4.1 Beta erste XML Beispiele/Tests

Verfasst: 03.06.2007 10:10
von ts-soft
Ich hab diesen Thread mal eröffnent, damit hier erste Beispiele/Tipps usw.
für die neue XML Lib gepostet werden. Im engl. Forum gibts auch schon
erste Beispiele: http://www.purebasic.fr/english/viewtopic.php?t=27392

Ich mach dann auch gleich den Anfang (meine XML-Kenntnisse sind etwas unter #NULL :wink: )

Code: Alles auswählen

EnableExplicit

Define.s XML
Define.l xmldoc, *node

XML = "<adressen>"
XML + " <adresse>"
XML + "  <vorname>Peter</vorname>"
XML + "  <nachname>Parker</nachname>"
XML + " </adresse>"
XML + " <adresse>"
XML + "  <vorname>Bruce</vorname>"
XML + "  <nachname>Wayne</nachname>"
XML + " </adresse>"
XML + " <adresse>"
XML + "  <vorname>Clark</vorname>"
XML + "  <nachname>Kent</nachname>"
XML + " </adresse>"
XML + "</adressen>"

Procedure ExamineXML(*node)
; diese Procedure geht rekursive alle Nodes durch
; und meldet alle gefundenen Personen ;)
  Protected I.l, *child, *new
  Protected NodeName.s, vorname.s, nachname.s
  For I = 1 To XMLChildCount(*node)
    *child = ChildXMLNode(*node, I)
    NodeName = GetXMLNodeName(*child)
    If NodeName = "vorname"
      vorname = GetXMLNodeText(*child)
      *new = NextXMLNode(*child)
      NodeName = GetXMLNodeName(*new)
      If NodeName = "nachname"
        nachname = GetXMLNodeText(*new)
        MessageRequester("Gefunden:", vorname + " " + nachname, #MB_ICONINFORMATION)
        vorname = "" : nachname = ""
      EndIf 
    EndIf
    ExamineXML(*child)
  Next
EndProcedure

xmldoc = CatchXML(#PB_Any, @XML, Len(XML))

If XMLStatus(xmldoc) = #PB_XML_Success
  *node = RootXMLNode(xmldoc)
  ExamineXML(*node)
EndIf 
FreeXML(xmldoc)  

Re: PB4.1 Beta erste XML Beispiele/Tests

Verfasst: 03.06.2007 14:30
von Kiffi
Bei bekannter XML-Struktur kann man auch direkt auf die entsprechenden
Knoten springen. Bei dem Expat-Parser von PB muss man den Nodepath
lediglich mit einem Nodezähler versehen (es gibt hier -- anders als bei
MSXML -- anscheinend keine NodeList, die als Ergebnis von SelectNodes
zurückgeliefert wird.). Durchläuft man eine simple Repeat - ForEver -
Schleife mit einem entsprechendem Break-Kriterium, muss man hier nicht
mit einer Rekursion arbeiten:

Code: Alles auswählen

Define.s XML
Define.l xmldoc, *node
Define.l NodeListCounter

XML = "<adressen>"
XML + " <adresse>"
XML + "  <vorname>Peter</vorname>"
XML + "  <nachname>Parker</nachname>"
XML + " </adresse>"
XML + " <adresse>"
XML + "  <vorname>Bruce</vorname>"
XML + "  <nachname>Wayne</nachname>"
XML + " </adresse>"
XML + " <adresse>"
XML + "  <vorname>Clark</vorname>"
XML + "  <nachname>Kent</nachname>"
XML + " </adresse>"
XML + "</adressen>"

xmldoc = CatchXML(#PB_Any, @XML, Len(XML))

If XMLStatus(xmldoc) = #PB_XML_Success
  
  *node = RootXMLNode(xmldoc)
  
  Repeat
    
    NodeListCounter + 1
    
    *child = XMLNodeFromPath(*node, "adressen/adresse[" + Str(NodeListCounter) + "]")
    
    If *child = 0 : Break : EndIf
    
    Debug "Vorname: "  + GetXMLNodeText(XMLNodeFromPath(*child, "vorname"))
    Debug "Nachname: " + GetXMLNodeText(XMLNodeFromPath(*child, "nachname"))
    Debug "---"
    
  ForEver
  
Else
  MessageRequester("", XMLError(xmldoc))
EndIf

FreeXML(xmldoc)

Verfasst: 03.06.2007 14:39
von ts-soft
Ich hab ja auch in der Richtung experimentiert, habs aber nicht
gerafft weil mir der letzte Teil mit den eckigen Klammern nicht bekannt war:

Code: Alles auswählen

*child = XMLNodeFromPath(*node, "adressen/adresse[" + Str(NodeListCounter) + "]") 
Danke Dir erstmal für Dein Beispiel und dann mal abwarten was
noch alles kommt :wink:

Verfasst: 03.06.2007 14:49
von Kiffi
ts-soft hat geschrieben:Ich hab ja auch in der Richtung experimentiert, habs aber nicht
gerafft weil mir der letzte Teil mit den eckigen Klammern nicht bekannt war
mir ging das ähnlich, weil ich bisher nur die Lösung mit SelectNodes() von
MSXML kannte.

An dieser Stelle sei noch angemerkt, dass

Code: Alles auswählen

/adressen/adresse
mit

Code: Alles auswählen

/adressen/adresse[1]
gleichzusetzen ist.

Grüße ... Kiffi

GetXMLAttribute() funktioniert nicht?

Verfasst: 04.06.2007 14:12
von derRaab
Hallo Leute!

Beim ausprobieren der XML-Prozeduren ist es mir leider nicht gelungen auf Attribute zuzugreifen:

Code: Alles auswählen

Define.s XML
Define.l xmlDoc, *rootNode, *childNode

XML = "<root rootAttribute='value'>" 
XML + " <child childAttribute='value' />"
XML + "</root>"

xmldoc = CatchXML(#PB_Any, @XML, Len(XML)) 

If XMLStatus(xmldoc) = #PB_XML_Success 
  
  *rootNode = ChildXMLNode( RootXMLNode(xmldoc) )
  
  Debug GetXMLNodeName( *rootNode )
  Debug GetXMLAttribute( *rootNode, "rootAttribute" )
  
  *childNode = ChildXMLNode( *rootNode )
  
  Debug GetXMLNodeName( *childNode )
  Debug GetXMLAttribute( *childNode, "childAttribute" )
  
EndIf
Die Attributewerte werde in meinem Test leider nicht ausgegeben.

Mache ich einen Fehler? Oder geht es nicht? :mrgreen:

*update*
Sorry, hab im englischen Forum was gefunden: http://www.purebasic.fr/english/viewtop ... lattribute Ist wohl ein Bug?

Verfasst: 04.06.2007 14:17
von ts-soft
Das scheint ein Bug zu sein, wurde bereits im engl. Forum gemeldet.
Hier ein workaround:

Code: Alles auswählen

Procedure.s GetXMLAttribute_(*Node, Attribute$)
  If XMLNodeType(*Node) = #PB_XML_Normal
    ExamineXMLAttributes(*node)
    While NextXMLAttribute(*node)
      If XMLAttributeName(*node) = Attribute$
        ProcedureReturn XMLAttributeValue(*node)
      EndIf
    Wend
  EndIf
EndProcedure
Macro GetXMLAttribute(Node, Attribute)
  GetXMLAttribute_(Node, Attribute)
EndMacro

Verfasst: 04.06.2007 14:18
von derRaab
Ja, sorry... :D

UND DANKE NATÜRLICH!!!

Verfasst: 09.06.2007 16:37
von PBZecke
Hallo!

Habe mich bis jetzt immer gewehrt mich mit xml zu beschäftigen, war für
mich immer son "internetzeugs". Habe aber jetzt mal bei Wikipedia
nachgelesen, ist aber sehr technisch gehalten.

Mir kommt das ganze irgendwie als Ersatz für ini's vor, womit ich sicherlich
falsch liege! Kann mir jemand mal 3 richtig gute Gründe nennen die es mir
schmackhaft machen könnten, meine Daten in XML zu speichern?

Verfasst: 09.06.2007 16:48
von ts-soft
Ini sind beschränkt auf 64 KB (nicht Preferences!)
Ini beschränkt sich auf darstellbare Zeichen, in XML kann man alles in
x-beliebiger Grösse packen, wenn man sich an die Regeln hält :wink:
XML können gestreamt werden, man ist also unabhängiger vom verfügbarem
Speicher.
XML wird oft auch als Datenbank verwendet, moderne Officeprogramme
verwenden XML zur Speicherung ihrer Dokumente.
Plattformunabhängig.
Schnell.

Nachteil:
- Exe wird duch hinzulinken der XML lib grösser
- Umgang mit XML muß erstmal verstanden werden (ich übe schon :wink: )

Meine XML-Noob Meinung :mrgreen:

Dies ist vielleicht interessant:
http://www.purebasic.fr/english/viewtop ... 363#198363

Verfasst: 09.06.2007 16:57
von edel
Fuer einfache Sachen ist die PreferenceLib immer noch besser.
Wer allerdings schon anfaengt seine Schluessel mit Zahlen zu
versehen (key1,key2 usw...) sollte sich xml zumindest einmal
ansehen.