AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte himXML (gesprochen himix ML)
Thema durchsuchen
Ansicht
Themen-Optionen

himXML (gesprochen himix ML)

Ein Thema von himitsu · begonnen am 12. Mär 2009 · letzter Beitrag vom 11. Nov 2020
Antwort Antwort
Seite 6 von 26   « Erste     456 7816     Letzte »    
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.342 Beiträge
 
Delphi 12 Athens
 
#1

Re: himXML (gesprochen himixML)

  Alt 22. Mai 2009, 10:57
Zitat:
Wenn man also nicht zwingend XML benötigt, ist das via StringList immer einfacher gewesen
also dagegen ist es schon noch etwas komplizierter, aber grad deswegen wird standardmäßig beim Erstellen die Grundstrucktur der XML schonmal erstellt
und man gleich loslegen

dieses für je das gleiche Ergebnis
Delphi-Quellcode:
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;
bzw:
Delphi-Quellcode:
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;
für
XML-Code:
<?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>
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)


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
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.342 Beiträge
 
Delphi 12 Athens
 
#2

Re: himXML (gesprochen himixML)

  Alt 22. Mai 2009, 14:22
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:
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
...
also 10,7 Minuten für 12.000.006 Tags und Attribute einer 386 MB-Datei

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
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#3

Re: himXML (gesprochen himixML)

  Alt 23. Mai 2009, 09:00
Zitat von himitsu:
Zitat:
Wenn man also nicht zwingend XML benötigt, ist das via StringList immer einfacher gewesen
also dagegen ist es schon noch etwas komplizierter, aber grad deswegen wird standardmäßig beim Erstellen die Grundstrucktur der XML schonmal erstellt[...]
Naja als Alternative für XML z.B. habe ich das folgendermaßen:
Code:
computers.count=1
computers[0].name=Hallo
computers[0].LastIPByte=101
computers[0].Left=100
computers[0].Top=25
In XML sähe das dann so aus:
Code:
<?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>
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)

MfG
xZise
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.342 Beiträge
 
Delphi 12 Athens
 
#4

Re: himXML (gesprochen himixML)

  Alt 23. Mai 2009, 17:11
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:
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;
oder du machst es selber, was aber auch nicht sooooo schwer ist

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:
// 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;
und mit Attributen:
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:
// 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;
man könnte auch Count weglassen und zählen:
Delphi-Quellcode:
// 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;
ich hoff mal, es ist jetzt nicht zu schwer?
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#5

Re: himXML (gesprochen himixML)

  Alt 23. Mai 2009, 17:26
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>
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).
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.342 Beiträge
 
Delphi 12 Athens
 
#6

Re: himXML (gesprochen himixML)

  Alt 23. Mai 2009, 19: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)
  • xoChangeInvalidChars - beim Einlesen und beim Zuweisen von Text an Nodes und Attribute werden ungültige Zeichen ersetzt
  • xoCaseSensitive - die Node/Attributsuche ist casesensitiv (normaler Weise sind XML-Dateien laut XML-Spezifikation casesensitiv)
  • xoHideInstructionNode - Instruktionen <?name ...?> werden rausgefiltert
    (keine Filterung in den ungefilterten NF-Funktionen > .Node = gefiltert > .NodeNF = ungefiltert)
  • xoHideTypedefNodes - Instruktion <!name ...?> werden rausgefiltert
  • xoHideCDataNodes - CDATA <[CDATA[...]]> wird rausgefiltert
  • xoHideCommentNodes - Kommentare <--...--> werden rausgefiltert
  • xoHideUnknownNodes - xtUnknown wird rausgefiltert
    (das sind Nodes mit "Text" an "falschen" Stellen ... z.B. <a><b/>unknown</a> ... Node "a" enthält einen Subnode "b" und "Text" ... falls jemandem ein besserer Name für diese Art von Nodes einfällt > bitte hier rufen)
  • xoNodeAutoCreate - beim Zugriff auf nicht existierende Nodes werden diese versucht zu erstellen
  • xoNodeAutoIndent - fügt Zeilenumbrüche und die Tag-Einrückung ein
  • xoCDataNotAutoIndent zusammen mit xoNodeAutoIndent - keine Einrükung für CDATA-Tags
  • xoFullEmptyElements - keine kurzen Tags - kein <tag /> sondern <tag></tag>
  • xoAutoSaveOnClose - beim .Free wird die geöffnete XML-Datei automatisch gespeichert

man kann den Standard aber allerdings über TXMLFile.DefaultOptions global für alle nachfolgend erstellten TXMLFile-Instanzen ändern
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#7

Re: himXML (gesprochen himixML)

  Alt 23. Mai 2009, 21:58
Hmm, bekomme es jetzt mit TDE2006 nicht mehr compiliert und leider immer brav die alte Version gelöscht.

Geht schon bei __CompareBlock los (Char <> WideChar). Du hast ja selber TDE2006, falls nicht poste ich eine genauere Fehlermeldung.
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#8

Re: himXML (gesprochen himixML)

  Alt 24. Mai 2009, 05:49
Welche Delphi Versionen werden unterstützt?
Vielleicht könntest du dies im 1. Beitrag erwähnen.
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.342 Beiträge
 
Delphi 12 Athens
 
#9

Re: himXML (gesprochen himixML)

  Alt 24. Mai 2009, 07:46
aktuell entwickle ich unter D2009 und direkt kompatibel düfte es bis Delphi 2006 / Turbo Delphi sein (wenn ich die kleinen Problemchen gefunden hab)

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
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#10

Re: himXML (gesprochen himixML)

  Alt 24. Mai 2009, 09:47
Ich hatte erstmal kurz geschaut, wie groß der Aufwand ist, es auf D5 anzupassen (das ich es in TDE2006 teste, zeigt was bei raus gekommen ist). Bin weinend vom PC weg, Du nutzt intensiv die neuen Möglichkeiten, die in D5 zu aufwändig umsetzbar sind. Wenn irgendwann in ferner Zukunft eine D7 Version kommen sollte, versuche ich das nochmal.

Ist auch wirklich ein schöner Quelltext (die Ausrichtung innerhalb von gleichen Ausdrücken usw.) macht es für mich richtig gut lesbar. Wenn bei Gelegenheit wieder eine Zwischen-Version kommt, die wieder auf dem TDE2006 läuft, wäre ich sehr dankbar. Will Dich aber nicht drängen, wenn das Projekt erstmal andere Prioritäten hat.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 6 von 26   « Erste     456 7816     Letzte »    


Forumregeln

Es 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

Gehe zu:

(?)

LinkBack to this Thread

Erstellt von For Type Datum
xml - MSXML alternative - Stack Overflow This thread Refback 28. Jun 2011 15:34

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:24 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-2025 by Thomas Breitkreuz