![]() |
Re: himXML (gesprochen himixML)
Interessantes Projekt, besonders weil ich das XML Format eigentlich mag. Aber es lässt sich so schlecht verwenden. Ich werde dein Projekt mal testen ;) Vll. taugt es was :)
MfG xZise |
Re: himXML (gesprochen himixML)
Zitat:
Und wenn es dir dennoch zu schwer ist ... siehe Tools, da kannst du es (fast) wie TIniFile oder TRegistry verwenden, falls des dir leichter fällt. :angel2: Zitat:
neues Update oben
[add] soeben ist noch 'ne weitere Demo (SAXParser.dpr) entstanden ... es ist sowas wie ein SAX-Parser, also die Daten werden schon wärend des Einlesens/Parsens ausgewertet und gleich wieder freigegeben (dieses hab ich einfach in der schon vorhandenen Callback-Funktion gelöst) man kann also auch mal Gigabyte-große Dateien parsen, ohne daß der geladene XML-Baum den RAM vollmacht [/add] SpeedTest.dpr liefert bei mir jetzt dieses Ergebnis
Code:
ich glaub damit kann ich erstmal leben :angel:
SetProcessAffinityMask: OK
use QueryPerformanceCounter precreating used strings - do not create and convert this within the measuring create:43 fill TXMLFile with 10.000 nodes and save this into a file create:0 fill:15 save:9 free:4 fill TXMLDocument with 10.000 nodes and save this into a file create:12 fill:6458 save:108 free:0 fill TXMLFile with 10.000 nodes, delete 8.000 nodes and save this into a file create:0 fill:15 delete:409 save:4 free:0 fill TXMLDocument with 10.000 nodes, delete 8.000 nodes and save this into a file create:0 fill:6303 delete:106310 save:97 free:0 fill TXMLFile with 10.000 nodes with attributes and save this into a file create:0 fill:691 save:386 free:5 fill TXMLDocument with 10.000 nodes with attributes and save this into a file create:0 fill:6589 save:122 free:0 fill TXMLFile with 100.000 nodes, save into and load this from a file create:0 fill:166 save:70 free:37 create:0 load:245 free:33 fill TXMLDocument with 100.000 nodes, save into and load this from a file create:0 fill:708145 save:348 free:0 create:0 load:331 free:94 fill TXMLFile with 10.000 nodes with attributes and search nodes create:0 fill:697 search:2746 free:4 fill TXMLDocument with 10.000 nodes with attributes and search nodes create:0 fill:6503 search:164476 free:0 press [enter] |
Re: himXML (gesprochen himixML)
Zitat:
MfG xZise |
Re: himXML (gesprochen himixML)
Zitat:
und man gleich loslegen :angel: dieses für je das gleiche Ergebnis
Delphi-Quellcode:
bzw:
XML := TXMLDocument.Create(nil);
XML.Active := True; XML.Version := '1.0'; XML.StandAlone := 'yes'; XML.Encoding := 'UTF-8'; XML.Options := [doNodeAutoIndent]; XML.AddChild('xml'); Node := XML.DocumentElement.AddChild('Node1'); Node.Text := 'Text'; XML.SaveToFile('test.xml'); XML.Free; // gut, das .Free kann man sich sparren, wenn man auf IXMLDocument umsteigt XML := TXMLFile.Create(nil); Node := XML.RootNode.Nodes.Add('Node1'); Node.Data := 'Text'; XML.SaveToFile('test.xml'); XML.Free; // oder gleich so ... XML := TXMLFile.Create(nil); XML.RootNode.Nodes['Node1'].Data := 'Text'; XML.SaveToFile('test.xml'); XML.Free;
Delphi-Quellcode:
für
XML := TXMLFile.Create(nil);
XML.RootNode.Nodes['Node1\Node2'].Data := 'Text 1'; XML.RootNode.Nodes['Node1\Node3'].Data := 'Text 2'; XML.RootNode.Nodes['Node4'].Data := 'Text 3'; XML.SaveToFile('test.xml'); XML.Free;
XML-Code:
per Standard werden (bis auf Kommentare) alle Steuer-Tags (ala <?...?> , <!...> und <![CDATA[...]]> ) rausgefiltert und (bis auf die ungefilterten NF-Funktionen) im Baum nicht aufgelistet. (siehe XML.Options)
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<xml> <Node1> <Node2>Text 1</Node2> <Node3>Text 2</Node3> </Node1> <Node4>Text 3</Node4> </xml> ja und wenn es wirklich einfach sein soll ... nja, ist quasi eine INI im XML-Format :nerd:
Delphi-Quellcode:
Var Ini: TXMLIniFile;
Ini := TXMLIniFile.Create('myOptions.xml'); Try Ini.WriteString('Section', 'Ident 1', S); Finally Ini.Free; End;
XML-Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<ini> <section name="Section"> <ident name="Ident 1">irgendein String</ident> </section> </ini> hab auch grad 'nen Fehler beim AutoUpdate der XML-Ini entdeckt (kleine Exception beim .Free) und gleich noch eine Parameterprüfung dort mit eingebaut wird beim nächsten Update mit hochgeladen |
Re: himXML (gesprochen himixML)
die dort drüben aufgetauchte Exception wurde behoben
> ![]() (kleiner Fehler beim Nachladen wärend ein Attribut ausgelesen wurde)
Code:
also 10,7 Minuten für 12.000.006 Tags und Attribute einer 386 MB-Datei
fill TXMLFile with 4.000.000 nodes, save into and load this from a file
create:0 fill:413022 save:404106 free:3261 create:0 load:643563 free:3104 fill TXMLDocument with 4.000.000 nodes, save into and load this from a file ... Im "pseudo" SAX-Mode wird in der Demo (SpeedTest.dpr) eine belibig große Datei mit nur 3 MB RAM innerhalb von 12 Minuten (0,5 MB/s) ausgelesen (also abzüglich der precreated-Arrays für die anderen Tests). OK, ist nicht wirklich schnell, aber es ist ja auch 'ne DOM-Lib Aktuell bin ich erstmal froh, daß es soweit läuft und Optimierungspotential gibt es noch (pro Byte zwei Funktionsaufrufe ... aber erstmal andere Fehler entdecken und dann kommt das dran) [add] die Demo_Tree.exe bitte neu komilieren, sonst kommt es noch zur obengenannten exception, bei Dateien über 64 KB alles neu kompiliert |
Re: himXML (gesprochen himixML)
Zitat:
Code:
In XML sähe das dann so aus:
computers.count=1
computers[0].name=Hallo computers[0].LastIPByte=101 computers[0].Left=100 computers[0].Top=25
Code:
Da ließe sich bestimmt noch einiges verbessern (mit Attributen z.B.) ... Aber genau aus diesem Grund möchte ich ja mal deine Unit testen, wobei ich im Moment noch nicht weiß wo (außer im obigen Beispiel... Aber da sind die Daten auf einen Computer in der Schule) :)
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<xml> <Computers> <Computer> <Name>Hallo</Name> <LastIPByte>101</LastIPByte> <Position> <Left>100</Left> <Top>25</Top> </Position> </Computer> </Computers> </xml> MfG xZise |
Re: himXML (gesprochen himixML)
entweder du probierst es mal mit der Serialisierung (Beispiele siehe Projekt Demo_Serialize).
> dieses speichert aber bei Objekten nur published Properties (für "alles" Andere bietet mir Delphi keine oder nur unzureichende Informationen) z.B. so in dieser Art:
Delphi-Quellcode:
oder du machst es selber, was aber auch nicht sooooo schwer ist
XML := TXMLFile.Create;
Try XML.RootNode.AddNode('Computers').Serialize(Computers, ....); XML.SaveToFile('Computers.xml'); Finally XML.Free; End; XML := TXMLFile.Create; Try XML.LoadFromFile('Computers.xml'); XML.RootNode.AddNode('Computers').Deserialize(Computers, ....); Finally XML.Free; End; dieses ergibt dein XML-Beispiel (nur noch mit dem Count-Node):
XML-Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<xml> <Computers> <Count>1</Count> <Computer> <Name>Hallo</Name> <LastIPByte>101</LastIPByte> <Position> <Left>100</Left> <Top>25</Top> </Position> </Computer> </Computers> </xml>
Delphi-Quellcode:
und mit Attributen:
// Speichern
XML := TXMLFile.Create; Try XML.RootNode.AddNode('Computers\Count').Data := Computers.Count; For i := 0 to Computers.Count - 1 do With XML.RootNode.AddNode('Computers\Computer') do Begin AddNode('Name').Data := Computers[i].Name; AddNode('LastIPByte').Data := Computers[i].LastIPByte; AddNode('Position\Left').Data := Computers[i].Left; AddNode('Position\Top').Data := Computers[i].Top; End; XML.SaveToFile('Computers.xml'); Finally XML.Free; End; // laden XML := TXMLFile.Create; Try XML.LoadFromFile('Computers.xml'); Computers.Count := XML.RootNode.Node['Computers\Count'].Data; For i := 0 to Computers.Count - 1 do With XML.RootNode.NodeList['Computers\Computer'][i] do Begin Computers[i].Name := Node['Name'].Data; Computers[i].LastIPByte := Node['LastIPByte'].Data; Computers[i].Left := Node['Position\Left'].Data; Computers[i].Top := Node['Position\Top'].Data; End; Finally XML.Free; End;
XML-Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<xml> <Computers Count="1"> <Computer Name="Hallo" LastIPByte="101" Left="100" Top="25"> </Computers> </xml>
Delphi-Quellcode:
man könnte auch Count weglassen und zählen:
// Speichern
XML := TXMLFile.Create; Try XML.RootNode.AddNode('Computers').Attributes['Count'] := Computers.Count; For i := 0 to Computers.Count - 1 do With XML.RootNode.AddNode('Computers\Computer') do Begin Attribute['Name'] := Computers[i].Name; Attribute['LastIPByte'] := Computers[i].LastIPByte; Attribute['Left'] := Computers[i].Left; Attribute['Top'] := Computers[i].Top; End; XML.SaveToFile('Computers.xml'); Finally XML.Free; End; // laden XML := TXMLFile.Create; Try XML.LoadFromFile('Computers.xml'); Computers.Count := XML.RootNode.Node['Computers'].Attribute['Count']; For i := 0 to Computers.Count - 1 do With XML.RootNode.NodeList['Computers\Computer'][i] do Begin Computers[i].Name := Attribute['Name']; Computers[i].LastIPByte := Attribute['LastIPByte']; Computers[i].Left := Attribute['Left']; Computers[i].Top := Attribute['Top']; End; Finally XML.Free; End;
Delphi-Quellcode:
ich hoff mal, es ist jetzt nicht zu schwer?
// Speichern
XML := TXMLFile.Create; Try For i := 0 to Computers.Count - 1 do With XML.RootNode.AddNode('Computers\Computer') do Begin ... End; XML.SaveToFile('Computers.xml'); Finally XML.Free; End; // laden XML := TXMLFile.Create; Try XML.LoadFromFile('Computers.xml'); Computers.Count := Length(XML.RootNode.Node['Computers'].NodeList['Computer']); For i := 0 to Computers.Count - 1 do With XML.RootNode.NodeList['Computers\Computer'][i] do Begin ... End; Finally XML.Free; End; // laden 2 (wenn es eh keine anderen Subnodes im Node "Computers" gibt) XML := TXMLFile.Create; Try XML.LoadFromFile('Computers.xml'); Computers.Count := XML.RootNode.Node['Computers'].Nodes.Count; For i := 0 to Computers.Count - 1 do With XML.RootNode.Node['Computers'].Node[i] do Begin ... End; Finally XML.Free; End; |
Re: himXML (gesprochen himixML)
XML-Code:
Was mir da gerade auffällt ist der enorme Overhead. Bei XML gibt es ja auch Komprimierung, ist da was für himXML geplant (evtl. halt erst in späteren Versionen).
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<xml> <Computers> <Count>1</Count> <Computer> <Name>Hallo</Name> <LastIPByte>101</LastIPByte> <Position> <Left>100</Left> <Top>25</Top> </Position> </Computer> </Computers> </xml> |
Re: himXML (gesprochen himixML)
Wenn du die Zeilenumbrüche und Einrückung meinst ... nimm einfach xoNodeAutoIndent aus den Optionen (.Options) raus :angel:
PS: die CDATA-Sektion wird seit vorgestern standardmäßig nicht mehr umgebrochen (diese hat, zusammen mit den Unknown-Nodes, eine eigene Behandlung bekommen) hierfür gibt es also xoNodeAutoIndent, xoCDataNotAutoIndent und xoFullEmptyElements insgesamt gibt es derzeit (die Fettgedruckten sind standardmäßig aktiv)
man kann den Standard aber allerdings über TXMLFile.DefaultOptions global für alle nachfolgend erstellten TXMLFile-Instanzen ändern |
Re: himXML (gesprochen himixML)
Hmm, bekomme es jetzt mit TDE2006 nicht mehr compiliert und leider immer brav die alte Version gelöscht. :gruebel:
Geht schon bei __CompareBlock los (Char <> WideChar). Du hast ja selber TDE2006, falls nicht poste ich eine genauere Fehlermeldung. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz