Seite 2 von 3

Verfasst: 09.06.2007 19:02
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

Verfasst: 09.06.2007 19:18
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)

Verfasst: 09.06.2007 19:27
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

Verfasst: 10.06.2007 06:31
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")




Verfasst: 10.06.2007 09:54
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

Verfasst: 10.06.2007 10:10
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

Verfasst: 10.06.2007 11:11
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

Verfasst: 10.06.2007 11:48
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

Verfasst: 10.06.2007 12:01
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.

Verfasst: 10.06.2007 12:24
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