|
Antwort |
himitsu
Online
Registriert seit: 11. Okt 2003
wollt eigentlich nur mal die ersten Fortschritte eines vor kurzem längerem begonnen Projektes vorstellen
es ist "nur" eine weitere kleine XML-Klasse. der Grund war eigentlich, daß mir andere XML-Projekte zu rießig sind und MSMXL (TXMLDocument) nicht grad schnell. [info] aktuell entwickle ich unter D2009 und direkt kompatibel düfte es bis Delphi 2006 / Turbo Delphi sein und Aufgrund einiger Anfragen versuch ich, sobald es da "gut" läuft, eine Extraversion weiter abwärtskompatibel zu machen ... mal sehn, bis wie weit runter das geht [/info] [add 04.01.2001] aktuell sieht es so aus, als wenn es schonmal bis zu D7 läuft [add/] aktueller Post: http://www.delphipraxis.net/internal...116416#1116416 #193
ansonsten bin ich für Tipps und Vorschläge dankbar [add 13.03.2009] ach ja falls der Name jemandem nich gefällt ... Beschwerden bitte an Matze richten [add] im Beitrag #193 wird etwas über die im Download mit enthalenen anderen XML-Libs geschrieben. [add] Achtung, beim Forenupgrad der DP sind die Dateikommentare verschwunden und die Dateinamen sind unglücklich importiert wurden. himxml_246.7z = v0.9 21.05.2009 himxml_164.7z = v0.99d 12.01.2010 other.7z = 30.12.2010 (only the "other" directory)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat, wird PoSex im Delphi viel seltener praktiziert. Geändert von himitsu (30. Dez 2010 um 09:29 Uhr) |
Delphi 2009 Professional |
#31
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
Fabian
|
Zitat |
Online
Delphi 12 Athens |
#32
Zitat von xZise:
Aber es lässt sich so schlecht verwenden.
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.
Zitat von xZise:
Ich werde dein Projekt mal testen Vll. taugt es was
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
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] |
Zitat |
Delphi 2009 Professional |
#33
Zitat von himitsu:
Zitat von xZise:
Aber es lässt sich so schlecht verwenden.
MfG xZise
Fabian
|
Zitat |
Online
Delphi 12 Athens |
#34
Zitat:
Wenn man also nicht zwingend XML benötigt, ist das via StringList immer einfacher gewesen
und man gleich loslegen 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
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 |
Zitat |
Online
Delphi 12 Athens |
#35
die dort drüben aufgetauchte Exception wurde behoben
> Schnelle XML Lib für große Dateien gesucht #35 (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 |
Zitat |
Delphi 2009 Professional |
#36
Zitat von himitsu:
Zitat:
Wenn man also nicht zwingend XML benötigt, ist das via StringList immer einfacher gewesen
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
Fabian
|
Zitat |
Online
Delphi 12 Athens |
#37
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; |
Zitat |
Delphi 2007 Professional |
#38
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> |
Zitat |
Online
Delphi 12 Athens |
#39
Wenn du die Zeilenumbrüche und Einrückung meinst ... nimm einfach xoNodeAutoIndent aus den Optionen (.Options) raus
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 |
Zitat |
Ansicht |
Linear-Darstellung |
Zur Hybrid-Darstellung wechseln |
Zur Baum-Darstellung wechseln |
ForumregelnEs ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus. Trackbacks are an
Pingbacks are an
Refbacks are aus
|
|
Erstellt von | For | Type | Datum |
xml - MSXML alternative - Stack Overflow | This thread | Refback | 28. Jun 2011 16:34 |
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
LinkBack URL |
About LinkBacks |