PB4.1 Beta erste XML Beispiele/Tests

Fragen und Bugreports zur PureBasic 4.0-Beta.
Little John

Beitrag von Little John »

Ein weiterer Unterschied:
Mit XML lassen sich baumartige Datenstrukturen (und zwar beliebige) direkt darstellen bzw. speichern. Bei Preferences (bzw. INI-Dateien) folgen die Abschnitte sequentiell aufeinander, sie lassen sich nicht verschachteln.

Ich freue mich sehr, dass PB 4.10 XML-Unterstützung mitbringt! :allright:

Gruß, Little John
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 »

>> Mit XML lassen sich baumartige Datenstrukturen (und zwar beliebige)
Ergänzung: Ausserdem als TreeLinkList im Speicher zu verwenden (muß nicht
gespeichert werden)
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
Little John

Beitrag von Little John »

Cool. Auf was für Ideen die "Jungs" so kommen ...
Die Firma heißt wohl nicht umsonst Fantaisie Software. :D

Little - ein bisschen traurig, PB erst relativ spät entdeckt zu haben - John
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Hier mal als einfaches assoziatives Array. Das witzige ist das man
kopieren, speichern und wieder einlesen kann.

Code: Alles auswählen


Structure sArray
  *vt.l
  obj.l
  bno.l
EndStructure

Interface iArray
  set(key.s,value.s)
  get.s(key.s)
  save(filename.s)
  load(filename.s)
  copy(*obj.sArray)
EndInterface 

Procedure _copy(*this.sArray,*obj.sArray)
  DeleteXMLNode(*obj\bno)
  CopyXMLNode(*this\bno,RootXMLNode(*obj\obj)) 
EndProcedure

Procedure _save(*this.sArray,file.s)
  SaveXML(*this\obj,file)
EndProcedure

Procedure _load(*this.sArray,file.s)
  FreeXML(*this\obj)
  *this\obj = LoadXML(#PB_Any,file) 
EndProcedure

Procedure _set(*this.sArray,key.s,value.s)
  Protected Node
  
  Node = XMLNodeFromPath(*this\bno,key) 
  If Node : DeleteXMLNode(Node) : EndIf  
  
  Node = CreateXMLNode(*this\bno)
  SetXMLNodeName(Node,key)
  SetXMLNodeText(Node,value)
  
EndProcedure 

Procedure.s _get(*this.sArray,key.s)
  Protected Node = XMLNodeFromPath(*this\bno,key)
  If Node
    ProcedureReturn GetXMLNodeText(Node) 
  EndIf 
EndProcedure

DataSection
AAVTable:
Data.l @_set(),@_get(),@_save(),@_load(),@_copy()
EndDataSection

Procedure NewArray()
  Protected *obj.sArray
  *obj = AllocateMemory(SizeOf(sArray))
  *obj\vt  = ?AAVTable
  *obj\obj = CreateXML(#PB_Any,#PB_Ascii)
  *obj\bno = CreateXMLNode(RootXMLNode(*obj\obj))
  SetXMLNodeName(*obj\bno,"base")
  ProcedureReturn *obj
EndProcedure

;##################################################################
;#                                                                 
;#                               TEST                              
;#                                                                 
;##################################################################


Test.iArray = NewArray()

Test\set("Erna","Hans")
Test\set("Herbert","Hilde")
Test\set("Dieter","Trude")

Test\save("blub.xml")

Test\set("Herbert","Heidi")

Test2.iArray = NewArray()
Test2\load("blub.xml")


test3.iArray = NewArray()
Test\copy(test3)

Debug Test2\get("Herbert")
Debug Test2\get("Erna")
Debug Test2\get("Dieter")

Debug "----------------"

Debug Test\get("Erna")
Debug Test\get("Herbert")
Debug Test\get("Dieter")

Debug "----------------"

Debug test3\get("Erna")
Debug test3\get("Herbert")
Debug test3\get("Dieter")



Little John

Beitrag von Little John »

Sehr interessant, ich hatte mich sowieso schon gefragt wie man in PB am besten assoziative Arrays implementiert.

Aber mal 'ne blöde Frage zu einem Nebenaspekt. Wie kann man erreichen, dass die gespeicherte Datei etwa so aussieht ...

Code: Alles auswählen

<?xml version="1.0" encoding="ISO-8859-1"?>
<base>
<Erna>Hans</Erna>
<Herbert>Hilde</Herbert>
<Dieter>Trude</Dieter>
</base>
... dass also durch Zeilenumbrüche an den entspr. Stellen die XML-Datei besser für Menschen lesbar ist?

Gruß, Little John
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Little John hat geschrieben:Wie kann man erreichen, dass die gespeicherte Datei etwa so aussieht ...
mit FormatXML(). Dieser Befehl ist aber in der jetzigen Version anscheinend
noch etwas buggy. (afaik hat es Timo bereits für die nächste Version gefixt)

Grüße ... Kiffi
Hygge
pebo
Beiträge: 66
Registriert: 01.12.2006 21:08
Wohnort: 66450 Bexbach

Beitrag von pebo »

Hallo zusammen,

wenn ich in den hier aufegführten Beispielcodes bei den Adressen einen Umlaut einfüge, also z.B.:

Code: Alles auswählen

XML = "<adressen>" 
XML + " <adresse>" 
XML + "  <vorname>Peter</vorname>" 
XML + "  <nachname>Pärker</nachname>" 
XML + " </adresse>" 
XML + " <adresse>" 
XML + "  <vorname>Bruce</vorname>" 
XML + "  <nachname>Wäine</nachname>" 
XML + " </adresse>" 
XML + " <adresse>" 
XML + "  <vorname>Clark</vorname>" 
XML + "  <nachname>Könt</nachname>" 
XML + " </adresse>" 
XML + "</adressen>" 
dann läuft das Beispiel von ts-soft durch, ohne eine Fehlermeldung, bzw. einer Ausgabe der Namen und beim Beispiel von kiffi kommt eine Fehlermeldung "not well formed(invalid token)".
Könnte mir da jemand auf die Sprünge helfen warum das so ist?

Gruss
Peter
Alle sagten "das geht nicht!" .... und dann kam einer der nichts davon wusste und machte es einfach.
Little John

Beitrag von Little John »

2Kiffi:
Danke für die Information.

Und wenn dann in der nächsten Beta-Version die Dokumentation zu XML vollständig ist, will ich mich auch gerne am testen beteiligen -- im Moment geht das schlecht, weil ich ja gar nicht weiß wie die einzelnen Befehle funktionieren sollen.

Gruß, Little John
freak
PureBasic Team
Beiträge: 766
Registriert: 29.08.2004 00:20
Wohnort: Stuttgart

Beitrag von freak »

pebo:
XML schreibt vor das bei fehlender XML Deklaration der Input als UTF-8 zu betrachten ist.
Du musst also entweder das in UTF-8 konvertieren, oder folgendes ganz
an den Anfang setzen:

Code: Alles auswählen

<?xml version="1.0" encoding="ISO-8859-1"?>
Little John:
Die englische Hilfe zu XML ist in der beta1 bereits komplett drin.
Little John

Beitrag von Little John »

freak hat geschrieben:Die englische Hilfe zu XML ist in der beta1 bereits komplett drin.
Danke für den Hinweis.

Wenn ich mich recht erinnere, wird man bei der Installation gefragt, welche Sprachversion der Hilfedatei man installieren möchte, oder?
Wie wäre es, wenn bei Beta-Versionen in solchen Fällen bei der Installation ein Hinweis erscheint etwa wie:
Achtung, die deutsche Hilfe ist in dieser Beta-Version noch nicht vollständig. Entsprechende Englischkenntnisse vorausgesetzt, empfehlen wir Ihnen die englische Hilfe zu installieren.
Denn das ahnt man ja nicht. :)
Ich denke, so ein Hinweis wäre auch im Interesse von Fantaisie Software selbst, denn Ihr hättet so mehr (potentielle) Beta-Tester.

Gruß, Little John
Gesperrt