XML - praktische Beispiele gesucht

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
gummibaerchen
Beiträge: 19
Registriert: Mi 4. Apr 2007, 14:32

XML - praktische Beispiele gesucht

Beitrag von gummibaerchen »

Hallo,

wieder zurück in Deutschland (nach einem halbjährigen Auslandsaufenthalt) muss ich mich jetzt erstmal in den Ferien mit Delphi befassen.

Da ich aber Linux nutze, bin ich sofort auf Lazarus gestoßen, welches mich sehr überzeugt!

Nachdem ich jetzt ein Sudoku-Programm erstellt habe, wollte ich zu der nächsten Aufgabe übergehen: ein Adressbuch.

Erstmal habe ich mir überlegt, wie man die Einträge am besten speichert und anzeigt.

Letztendlich habe ich mich für XML entschieden, weil ich damit doch flexibler bin, und für jeden Kontakt individuelle Felder erstellen kann, wobei das mit einer Datenbank anders aussehen würde.

Es soll einmal Kernfelder geben (Name, Straße, Ort, Telefon, Geburtstag), und dann kann man halt optional noch weiteres zu jedem Kontakt hinzufügen (Handy, Jabber, etc.).

Beim Export (CSV) werden halt nur die Kernfelder exportiert, mit denen jedes CSV kompatible Programm umgehen können sollte.

Hier mal ein Beispiel, wie ich mir den Aufbau der XML-Datei überlegt habe:

Code: Alles auswählen

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<adressbuch>
     <titel>Peters privates Adressbuch</titel>
     <eintrag>
          <name>Peter Pan</name>
          <straße>Trickfilm-Weg 10</straße>
          <ort>Hollywood</ort>
     </eintrag>
     <eintrag>
          <name>MickeyMouse</name>
          <straße></straße>
          <ort></ort>
          <jabber name="Jabber">mickey@disney.org</jabber>
          <icq name="ICQ">12345678</icq>
     </eintrag>
</adressbuch>
Das konkrete Problem besteht jetzt darin, dass ich noch nichts über den Umgang mit XML über Pascal weiß.

Ich denke nur, dass TXMLConfig für diesen Zweck nicht ausreicht, aber konnte das noch nicht genau testen.

Daher ist meine Bitte jetzt, dass ihr mir bitte konkrete Beispiele, Units oder Tutorials aufzeigt.

Danke,
Timm

Benutzeravatar
theo
Beiträge: 10867
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Wikiwiki

http://wiki.lazarus.freepascal.org/Xml" onclick="window.open(this.href);return false;

gummibaerchen
Beiträge: 19
Registriert: Mi 4. Apr 2007, 14:32

Beitrag von gummibaerchen »

theo hat geschrieben:Wikiwiki

http://wiki.lazarus.freepascal.org/Xml" onclick="window.open(this.href);return false;
Die beiden Sachen habe ich mir schon durchgelesen.

Ich hatte halt gehofft, dass hier ein paar Leute ähnliche Probleme hatten und ein paar Beispiel geben könnten.

Zum Beispiel wie ich bei einzelnen Kontakten dann mal den Namen in der Datei ändere und sowas.

Sollte man überhaupt direkt mit der XML Datei arbeiten, oder lieber alles "zwischenspeichern" und erst beim schließen wieder in die XML Datei schreiben?

Zudem habe ich mir noch gedacht, dass jeder Kontakt eine "ID" hat (mdsum aus Uhrzeit + Name) um ihn dann im XML Dokument wieder zu finden, falls es zwei Personen mit dem gleichen Namen geben sollte.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Wenn du unter 200 Kontakte planst, dann kannst du das ruhig mit XML machen. Bei viel mehr wird die Startzeit deines Programms und das beenden auch schon spürbar träge sein.

Zu deinem " Problem" was erwartest du jetzt ? Das wir die fertigen Quellcode für deine XML Datei vorwerfen ?

Wenn du konkrete Fragen hast frag doch bitte die.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

gummibaerchen
Beiträge: 19
Registriert: Mi 4. Apr 2007, 14:32

Beitrag von gummibaerchen »

Christian hat geschrieben:Zu deinem " Problem" was erwartest du jetzt ? Das wir die fertigen Quellcode für deine XML Datei vorwerfen ?
Nein, natürlich erwarte ich nicht, dass ihr das für mich macht. Ich dachte einfach, dass vielleicht jemand Snippets rumliegen hat, die er hier posten würde und ich mir das damit dann erklären kann.
Christian hat geschrieben:Wenn du konkrete Fragen hast frag doch bitte die.
Meine Fragen wären:
- Womit lese/speichere ich XML am besten?
- Welches Format soll ich für die interne Verarbeitung verwenden?
- Wie greife ich auf spezielle "Blöcke" zu?
- Zum Beispiel das "Name" Feld des Kontaktes mit der "ID" 12345

Ich dachte, dass ich mir das selber erklären könnte, wenn ich halt ein konkretes Beispiel für I/O mit XML sehe.

Leider komme ich mit den genannten Tutorials im Wiki noch nicht so ganz weit.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

ich würde mir selbst so ein Paser schreiben.
du musst intern ein andres Format haben z.b. ein Array oder so.
Das währe das einfachste. Jetzt erzeugt du einfach nur die Datei neu beim hinzufügen/löschen bzw. beim speichern. und Fertig ist die sache.

Beim Lesen muss du die Datei nur Pasen und das dürfte nicht weiter schwirig sein.

Ich habe mal sowas mit HTML gemacht, hat ja die gleiche Syntax.
Ich halte nicht viel von XML speicher Formate, für kleine Daten mengen ja aber was machst du wenn du große Daten mengen hast ?
MFG
Michael Springwald

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

- Womit lese/speichere ich XML am besten?
http://wiki.freepascal.org/Networking/de#XML

(^ 1. Eintrag bei Suche in Google: "fpc xml")
- Welches Format soll ich für die interne Verarbeitung verwenden?
Du bist der Entwickler und dir werden da keine Grenzen gesetzt, denk dir was aus. Da du ja keine Datenbank nehmen willst musst du eh alles im Speicher halten und wie du es da strukturierst ist dein Bier.
- Wie greife ich auf spezielle "Blöcke" zu?


Bitte ?
- Zum Beispiel das "Name" Feld des Kontaktes mit der "ID" 12345
Siehe 1. Antwort
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

gummibaerchen
Beiträge: 19
Registriert: Mi 4. Apr 2007, 14:32

Beitrag von gummibaerchen »

Christian hat geschrieben:Da du ja keine Datenbank nehmen willst musst du eh alles im Speicher halten und wie du es da strukturierst ist dein Bier.
Ich hatte mir gedacht, dass XML für ein kleineres Adressbuch einfach praktischer sei. (Weil man es eben leicher erweitern kann)

Obwohl natürlich gerade bei Lazarus einem viel Arbeit beim Arbeiten mit Datenbanken abgenommen wird.

Vielleicht sollte ich meine Wahl nochmal überdenken, und erstmal ein 08/15 Adressbuch schreiben, und mir dass dann nachher nochmal mit dem XML ansehen.

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

Im example_Ordner ist übrigens auch ein Adressbuch dabei, fals du dich mal inspirieren lassen willst. Dort wird ne kleine lokale DB erstelle.

gummibaerchen
Beiträge: 19
Registriert: Mi 4. Apr 2007, 14:32

Beitrag von gummibaerchen »

monta hat geschrieben:Im example_Ordner ist übrigens auch ein Adressbuch dabei, fals du dich mal inspirieren lassen willst. Dort wird ne kleine lokale DB erstelle.
Ja, danke, das hatte ich einmal kurz angeschaut, und es ist ja auch sehr DB lastig.

Da ich dann dachte, XML sei besser, habe ich das einfach verworfen. Zu DBs gibt es ja viel mehr Hilfe/Tutorials und daher überlege ich noch ob ich jetzt zu DB switche.

Naja, ich schaue erstmal noch weiter, was ich noch zu XML finden/machen kann.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

- Wie greife ich auf spezielle "Blöcke" zu?


Bitte ?
ich glaube damit meint er es genau so wie bei Ini Dateien... oder ?

ich würde an deiner stelle kein XML nehmen. Ich weiß viele Programme nutzen es für ihre Config Dateien. Ich halte davon nicht. weil ich der Meinung bin, das das Pasen sehr viel Zeit kostet.

Für wenige Dateien geht das.

was hälst du denn von so einem Format:
Vorname|Nachname|Ort|PLZ|Tele.|und weiter
Vorname|Nachname|Ort|PLZ|Tele.|und weiter
Vorname|Nachname|Ort|PLZ|Tele.|und weiter
wenn du ein Baum haben möchte ist das auch gar nicht weiter schwirg :
Vorname|Nachname|Ort|PLZ|Tele.|und weiter
test/test2
Vorname|Nachname|Ort|PLZ|Tele.|und weiter
test/test1
Vorname|Nachname|Ort|PLZ|Tele.|und weiter
z.b. ....
MFG
Michael Springwald

gummibaerchen
Beiträge: 19
Registriert: Mi 4. Apr 2007, 14:32

Beitrag von gummibaerchen »

pluto hat geschrieben:was hälst du denn von so einem Format:
Vorname|Nachname|Ort|PLZ|Tele.|und weiter
Vorname|Nachname|Ort|PLZ|Tele.|und weiter
Vorname|Nachname|Ort|PLZ|Tele.|und weiter
Das wäre ja schon gleich so etwas wie CSV.

Hätte natürlich auch Vorteile, da sowieso ein CSV-Export geplant war, nur ist das Format ja etwas unflexibel um alles aufzunehmen.

Am optimalsten wäre vllt doch sqlite und dann halt der Export nach CSV wenn gewünscht.

Nur das man halt "Extra-Felder" (Jabber, ICQ, o.ä.) für alle Kontakte anlegen würde (als Spalte in der Tabelle).

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Ich hab schonmal erklärt wofür xml ist viele cheinen das stylisch zu finden und gar nicht zu wissen was das ist. Vorallem Pluto obwohl ichs ihm schon mal erklärt habe.

XML kann man transformieren.
Die kannst aus deinem XML Addressbuch nur mit einem sheet eine HTML Seite eine CVS eine TXT und was weiss ich nicht machen. Kannst eigentlich fast belibige Dateiformate daraus generieren. Das ist der Vorteil an XML.
Es braucht ziemlich lange um es zu parsen, ja da hat Pluto schon recht deshalb musst du abwägen was du willst. Wenn es nur wenige einträge enthalten soll kannst du xml nehmen. Wenn du Tausende Einträge möchtest nimm ein Datenbanksystem.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Benutzeravatar
theo
Beiträge: 10867
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Ja, mit XML ginge das schon.
Habe übrigens soeben festgestellt, dass die englische Version von
http://wiki.lazarus.freepascal.org/Networking" onclick="window.open(this.href);return false;
mehr Informationen enthält als die deutsche.
v.a. Sachen wie PassNode := Doc.DocumentElement.FindNode('password');

Es gibt immer verschiedene Wege, sowas zu machen.
Es ist sicher auch nicht schlecht, sich mal eine Interne Struktur zu halten.
z.B. eine Liste von Objekten einer Klasse mit allen möglichen Feldern, ob sie benötigt werden oder nicht.
Diese könntest du dann z.B. mit Hilfe des DataPackers:
http://www.lazarusforum.de/viewtopic.php?p=2108#2108" onclick="window.open(this.href);return false;
raus- und rein- streamen.
Der Overhead ist dabei ziemlich gering.

Je nachdem wie weit man gehen will, kann man sich auch selber gewisse Datenbank-funktionalitäten programmieren.

Ich habe z.B. für meine MP3Ola selber Quicksorts, Binary Search und Filter implementiert, um das letzte an Speed herauszuholen, und um nicht von externen Datenbanken abhängig zu sein.

Das liest sich dann Beispielsweise so (Nostalgie Code = Tränende Augen ;-)

Code: Alles auswählen

function TMP3DB.FieldFromAuto(Auto: Cardinal): PMP3Data;
//Binary Search. Assume List sorted by Auto //MainArry MAY NOT BE ALTERED
var
  L, H, I, C: Integer;
  Found: Boolean;
begin
  Found := false;
  L := 0;
  H := High(fMainArray);
  while L <= H do
  begin
    I := (L + H) shr 1;
    C := fMainArray[i].Auto - Auto;
    if C < 0 then L := I + 1 else
    begin
      H := I - 1;
      if C = 0 then
      begin
        Found := true;
        L := I;
      end;
    end;
  end;
  if Found then Result := @fMainArray[L] else Result := FieldFromAutoUnsorted(Auto); //worst case
end;
Nur um MP3 Daten von externer 200GB Platte zu verwalten.
Zuletzt geändert von theo am Do 5. Apr 2007, 00:20, insgesamt 1-mal geändert.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Am optimalsten wäre vllt doch sqlite und dann halt der Export nach CSV wenn gewünsch
sqlite ist gar nicht mal so schwer, ich habe damit unter Delphi gearbeitet und gesehen das es sowas auch unter Lazarus gibt.
XML kann man transformieren.
du kannst jedes Format umwandeln in jedes das spielt keine rolle.
Wenn du erstmal die Daten im Speicher hast, kannst du alles damit machen.
Dabei spielt das speicher Format keine rolle.
Von daher weiß ich einfach nicht warum alle XML haben wollen. es einfach nur ein Format wie viele anderen.
MFG
Michael Springwald

Antworten