PB4.1 Beta erste XML Beispiele/Tests

Fragen und Bugreports zur PureBasic 4.0-Beta.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

PB4.1 Beta erste XML Beispiele/Tests

Beitrag 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)  
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: PB4.1 Beta erste XML Beispiele/Tests

Beitrag 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)
Hygge
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
Hygge
Benutzeravatar
derRaab
Beiträge: 71
Registriert: 30.12.2004 13:45
Wohnort: Berlin
Kontaktdaten:

GetXMLAttribute() funktioniert nicht?

Beitrag 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?
Zuletzt geändert von derRaab am 04.06.2007 14:17, insgesamt 1-mal geändert.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
derRaab
Beiträge: 71
Registriert: 30.12.2004 13:45
Wohnort: Berlin
Kontaktdaten:

Beitrag von derRaab »

Ja, sorry... :D

UND DANKE NATÜRLICH!!!
Benutzeravatar
PBZecke
Beiträge: 394
Registriert: 02.09.2004 17:34

Beitrag 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?
Nein, ich habe die Suche nicht benutzt, und deshalb auch nichts dazu gefunden... :lol:
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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.
Gesperrt