AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein XML Delphi Unterschiedliche Record-Strukturen in XML speichern
Thema durchsuchen
Ansicht
Themen-Optionen

Unterschiedliche Record-Strukturen in XML speichern

Ein Thema von Luckie · begonnen am 18. Apr 2004 · letzter Beitrag vom 18. Apr 2004
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

Unterschiedliche Record-Strukturen in XML speichern

  Alt 18. Apr 2004, 13:35
Ich bin gerade dabei und plane eine Adressdatenbank zu schreiben. Speichern wollte ich die Datensätze in einer XML Datei. Und zwar aus zwei Gründen: Erstmal will ich mich etwas mit XML beschäftigen und zweitens wollte ich dann, in einer späteren Version, die XML-Datei hochladen auf meinem Webspace und dazu eine HTML-Datei schreiben, welche mir den Inhalt der XML-Datei anzeigt. Da auch ein Abgleich möglich sein soll, wenn man die XML-Datei von wo anders editiert hat, wollte ich entsprechende Infos in der XML-Datei speichern, da Mathias S. aus F. bei C. gesagt hat, man könne auch auf die XML-Datei online zugreifen ohne sie runterzuladen. Ich könnte also erst prüfen ohne was runterzuladen.

So, es sieht jetzt also so aus:
Als erstes wollte ich ein Record wie folgt speichern:
Delphi-Quellcode:
type
  TXMLFile = record
     FVerMajor: Cardinal;
     FVerMinor: Cardinal;
     FDate: TDate;
     FTime: TTime;
     FNextRecordID: Cardinal;
     FRecordCount: Cardinal;
  end;
Und dann die ganzen Datensätze als Records.
Delphi-Quellcode:
type
  TKontakt = record
    Name: String;
    Vorname: String;
    ...: ...;
    ...: ...;
  end;
Jetzt die Frage: Ist das ohne weiteres möglich oder muss man da irgendwelche Klimmzüge für machen?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#2

Re: Unterschiedliche Record-Strukturen in XML speichern

  Alt 18. Apr 2004, 15:09
Zitat von Luckie:
Und zwar aus zwei Gründen: Erstmal will ich mich etwas mit XML beschäftigen und [...]
Guter Grund.

Zitat:
[...] da Mathias S. aus F. bei C. gesagt hat, man könne auch auf die XML-Datei online zugreifen ohne sie runterzuladen.
Ja, das habe ich gesagt. Und mit dem Updateprogramm habe ich das ja auch bewiesen. Aber streng genommen wird die XML-Datei beim MS-XML-Parser bspw. in den Cache geladen. Aber trotzdem: selbst darum kümmern musst du dich nicht.

Zitat:
[...] Da auch ein Abgleich möglich sein soll, wenn man die XML-Datei von wo anders editiert hat, wollte ich entsprechende Infos in der XML-Datei speichern [...]
Na ja, hier weiß ich nicht genau was du meinst. Es ist sicher möglich, auf die XML-Datei zuzugreifen, wenn diese auf deinem Server liegt. Aber auf dem Server speichern wird wohl mit dem Parser nicht gehen. Dazu müsstest du dann wahrscheinlich doch wieder mit FTP ran.

Zitat:
Jetzt die Frage: Ist das ohne weiteres möglich oder muss man da irgendwelche Klimmzüge für machen?
Eigentlich nicht. Da du dir bei XML ja eigene Tags ausdenken kannst, hängt die Dokumentenstruktur ganz von dir ab. Du musst eben nur bedenken, dass es nur einen root-Knoten geben darf, und dass die untergeordneten Namen alle dem gleichen Prinzip folgen sollten, etwa
Code:
<?xml version="1.0"?>
<adressen>
  <kontakt>
    <name>S.</name>
    <vorname>Mathias</vorname>
    <wohnort>F. bei C.</wohnort>
    <iq>menschliche Skala nicht ausreichend</iq>
  </kontakt>
</adressen>
Da ich nur für den Parser von Microsoft sprechen kann, brauchst du im Programm auch nicht mit Records hantieren. Du kannst direkt mit IXMLDOMNode-Objekten arbeiten und diese relativ schnell auslesen:
Delphi-Quellcode:
kontakte := xmldoc.selectNodes('/adressen/kontakt');
// kontakte = IXMLDOMNodeList
Damit hättest du vereinfacht gesagt ein Array aus IXMLDOMNodes mit allen gefundenen "<kontakt>"-Knoten samt Inhalt, den du dann auslesen und in deinem Programm darstellen kannst.

Und wenn du auch eine DTD mit passender Definition integrierst, dann meckert der Parser beim Laden bereits, wenn irgendwas an der Datei nicht stimmt. Ein nicht zu unterschätzender Vorteil, weil manipulierte oder versehentlich falsche Dateien sofort auffallen.
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#3

Re: Unterschiedliche Record-Strukturen in XML speichern

  Alt 18. Apr 2004, 15:15
Ein PS:

Zitat von Luckie:
[...] die XML-Datei hochladen auf meinem Webspace und dazu eine HTML-Datei schreiben, welche mir den Inhalt der XML-Datei anzeigt.
Das könnte problematisch werden. Der IE und der Mozilla sind mit einem entsprechenden XSL-Stylesheet/Transform in der Lage, XML-Code in HTML-Code umzuwandeln. Aber der Mozilla benötigt dazu (zumindest online) einen Eintrag in der Server-Konfiguration, sonst kann er mit dem Typ XML nichts anfangen. Offline (auf der lokalen Platte) geht es allerdings. Und der Opera kann mit XML momentan noch gar nichts anfangen.

Ich würde daher Skript (bspw. PHP oder Perl) vorschlagen, das das Dokument entsprechend parst. Und da hast du bei PHP im Moment nur den SAX mit dem Nachteil, dass das XML-Dokument nicht zu verschachtelt sein sollte bzw. dass alle Knoten vorhanden sein müssen. Denn SAX parst nur das, was er findet. Und wenn du bspw. optionale Knoten hast, dann ist am Ende möglicherweise der HTML-Code kaputt.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Unterschiedliche Record-Strukturen in XML speichern

  Alt 18. Apr 2004, 17:40
Zitat von MathiasSimmack:
Zitat:
[...] da Mathias S. aus F. bei C. gesagt hat, man könne auch auf die XML-Datei online zugreifen ohne sie runterzuladen.
Ja, das habe ich gesagt. Und mit dem Updateprogramm habe ich das ja auch bewiesen. Aber streng genommen wird die XML-Datei beim MS-XML-Parser bspw. in den Cache geladen. Aber trotzdem: selbst darum kümmern musst du dich nicht.
Na ja das ist sowieso erstmal zweitrangig. Es ging mir nur darum nicht explizit die datei runterladen zumüssen. Dass sie letzt endlich doch irgendwo im Cache landet iast irgendwie logisch.

Zitat:
Zitat:
[...] Da auch ein Abgleich möglich sein soll, wenn man die XML-Datei von wo anders editiert hat, wollte ich entsprechende Infos in der XML-Datei speichern [...]
Na ja, hier weiß ich nicht genau was du meinst. Es ist sicher möglich, auf die XML-Datei zuzugreifen, wenn diese auf deinem Server liegt. Aber auf dem Server speichern wird wohl mit dem Parser nicht gehen. Dazu müsstest du dann wahrscheinlich doch wieder mit FTP ran.
Ich meine,w enn ich bei meiner Freundin bin lad ich mir die aktuelle Version runter. Kann sie editieren und wieder hochladen. Zu hause kann ich sie dann wieder unterladen und habe wieder lokal eine aktuelle Version. Ob ich mir da was mit FTP baue, mal sehen. Soweit bin ich ja noch gar nicht.

Zitat:
Zitat:
Jetzt die Frage: Ist das ohne weiteres möglich oder muss man da irgendwelche Klimmzüge für machen?
Eigentlich nicht. Da du dir bei XML ja eigene Tags ausdenken kannst, hängt die Dokumentenstruktur ganz von dir ab. Du musst eben nur bedenken, dass es nur einen root-Knoten geben darf, und dass die untergeordneten Namen alle dem gleichen Prinzip folgen sollten, etwa
Code:
<?xml version="1.0"?>
<adressen>
  <kontakt>
    <name>S.</name>
    <vorname>Mathias</vorname>
    <wohnort>F. bei C.</wohnort>
    <iq>menschliche Skala nicht ausreichend</iq>
  </kontakt>
</adressen>
Ich würde als Rootnode die Bezeichnung "Kontakt" wählen. Der erste Subnode wäre dann der Record mit dem XML-Dateiinfos und alle weiteren Subnodes wären die Kontakte.

Zitat:
Da ich nur für den Parser von Microsoft sprechen kann, brauchst du im Programm auch nicht mit Records hantieren. Du kannst direkt mit IXMLDOMNode-Objekten arbeiten und diese relativ schnell auslesen:
Delphi-Quellcode:
kontakte := xmldoc.selectNodes('/adressen/kontakt');
// kontakte = IXMLDOMNodeList
Damit hättest du vereinfacht gesagt ein Array aus IXMLDOMNodes mit allen gefundenen "<kontakt>"-Knoten samt Inhalt, den du dann auslesen und in deinem Programm darstellen kannst.
Ich denke mit Records kann ich Programm intern besser arbeiten.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#5

Re: Unterschiedliche Record-Strukturen in XML speichern

  Alt 18. Apr 2004, 17:48
Zitat von Luckie:
Ich meine,w enn ich bei meiner Freundin bin lad ich mir die aktuelle Version runter. Kann sie editieren und wieder hochladen. Zu hause kann ich sie dann wieder unterladen und habe wieder lokal eine aktuelle Version. Ob ich mir da was mit FTP baue, mal sehen. Soweit bin ich ja noch gar nicht.
Ja, aber das wirst du schätzungsweise mit FTP machen müssen, denn der Server "weiß" ja nicht, dass dein Programm, mit dem du die XML-Datei lädtst, auch theoretisch (wenn du es bedienst!) die Berechtigung hat, die Datei dort auch wieder zu speichern.

Zitat:
Ich würde als Rootnode die Bezeichnung "Kontakt" wählen. Der erste Subnode wäre dann der Record mit dem XML-Dateiinfos und alle weiteren Subnodes wären die Kontakte.
Wie gesagt: Das liegt bei dir. Denk dir was aus! Wobei sich die Datei-Infos IMHO kürzen lassen. Die Versionsdaten und Zeit/Datum, das kann man sicher speichern. Aber diese beiden hier:
Zitat:
Delphi-Quellcode:
type
  TXMLFile = record
     { ... }

     FNextRecordID: Cardinal;
     FRecordCount: Cardinal;
  end;
halte ich in der XML-Datei für überflüssig. Eine ID brauchst du nicht, denn jeder Knoten mit den Adressdaten wäre ein eigenes Objekt und ließe bspw. mit XPath über irgendeinen Wert (Name, Telefon-Nr. usw.) finden (grob vereinfacht gesagt: wie in einer Datenbank). Und die Anzahl der Knoten erhältst du bspw. durch die o.g. Anweisung und die Ergänzung
ShowMessage(inttostr(kontakte.length));
Zitat:
Ich denke mit Records kann ich Programm intern besser arbeiten.
Nicht böse sein, aber das nimmt sich nichts. Es sei denn, du willst das XML-Objekt nach dem Laden und Lesen der Daten wieder freigeben. Wenn du es aber ohnehin im Speicher hast bzw. behältst, dann kannst du auch direkt auf die Knoten zugreifen.

Edit: Und gerade wenn du vielleicht einen neuen Kontakt einfügen willst (vor einem anderen), geht das mit dem XML-Objekt viel einfacher als die Records im RAM umzusortieren.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Unterschiedliche Record-Strukturen in XML speichern

  Alt 18. Apr 2004, 18:11
Das mit den Infos über die Datei wren meine ersten Überlegzungen heute Nacht gegen drei Uhr. Ichhabe mal das Tutorial von Chackotay überflogen und ich komme wohl auch ohne aus.

Und wegen der ID, sicher ist sicher, um einen Datensatz eindeutig identifizieren zu können. Ich werde ein paar Puffs zum beispiel drinne ahben, wie soll ich die auseinanderhalten, wenn ich nur nach dem nachnamen gehe? oder wie ist es mit Firmen, die keinen Nachnamen haben?

Und Record oder nicht. mal sehen. Ich tendiere trotzdem dazu es so zu machen, weil ich denke, dass es den Code übersichtlicher macht.

Mit dem Hochladen wird es wohl auf eine FTP Lösung hinauslaufen. Aber das ist erst der zwiete Schritt. Erstaml will ich alles lokal machen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Alexander

Registriert seit: 28. Aug 2002
Ort: Oldenburg
3.513 Beiträge
 
Turbo Delphi für .NET
 
#7

Re: Unterschiedliche Record-Strukturen in XML speichern

  Alt 18. Apr 2004, 18:25
Fürs Hochladen kannst evtl. auch was mit PHP machen, das du über dein Programm steuerst..
Auf http://www.php-faq.de ist ein Beispiel für ein solches PHP-Script.
Alexander
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#8

Re: Unterschiedliche Record-Strukturen in XML speichern

  Alt 18. Apr 2004, 19:07
@Luckie: Ich wollte keine Vorschriften machen. Ich habe nur versucht, deine Grundsatzfragen zu beantworten. Speziell
Zitat:
Ist das ohne weiteres möglich oder muss man da irgendwelche Klimmzüge für machen?
Die Antwort lautet: Nein. Edit: Halt! Natürlich musst du die XML-Regeln beachten. Also ein "wohlgeformtes" Dokument schreiben, und die Zeichencodierung beachten, da ich mal davon ausgehe, dass evtl. einige deiner Kontakte Umlaute o.ä. im Namen oder der Adresse haben.

Letzten Endes, und das weiß ich aus eigener Erfahrung, wird sich der Aufbau des Dokumentes erst dann ergeben, wenn du tatsächlich mit deinem Programm anfängst. Das war bei mir nicht anders. Ich habe bemerkt, dass sich einige Sachen leichter realisieren lassen, und -schwupps- schon sah meine XML-Datei wieder anders aus.
Und tatsächlich helfen kann ich (oder wer auch immer) wahrscheinlich ohnehin erst wenn sich Probleme im Quell- oder XML-Code ergeben. Aber dazu musst du, natürlich!, erst mal in aller Ruhe mit deinem Programm anfangen und die ersten Zeilen schreiben, usw.

Zitat:
Und wegen der ID, sicher ist sicher, um einen Datensatz eindeutig identifizieren zu können. Ich werde ein paar Puffs zum beispiel drinne ahben, wie soll ich die auseinanderhalten, wenn ich nur nach dem nachnamen gehe? oder wie ist es mit Firmen, die keinen Nachnamen haben?
Ja, aber eine Adresse und/oder Telefon-Nr. wird´s doch geben. Konkretes Beispiel: Nimm die XML-Daten auf meiner Startseite. Bei den Dokumentationen steht zweimal Inno Setup drin (einen Eintrag sieht man nicht, weil nur die 3 aktuellsten angezeigt werden), und die beiden Einträge unterscheiden sich nur durch ihre Beschreibung. Ich habe hier ein kleines Programm zum Erstellen dieser Dateien zusammengeschraubt, und das sucht (wenn ich was bearbeiten muss) nach dem Knoten und zieht dabei sowohl Titel als auch Beschreibung zum Vergleich heran.

Aber wie gesagt, solche Sachen können wir immer noch klären wenn dein Programm schon ein wenig Form angenommen hat.
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Unterschiedliche Record-Strukturen in XML speichern

  Alt 18. Apr 2004, 22:53
Mal unabhängig davon ob es zwei Einträge gibt, die völlig identisch sind oder nicht: Eine Zahl mit einer anderen zu vergleichen geht doch viel schneller und einfacher als zu kucken, ob der Name gleich ist, wenn ja, dann die Adresse, wenn die wieder gleich ist, dann die Telefonnummer usw.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#10

Re: Unterschiedliche Record-Strukturen in XML speichern

  Alt 18. Apr 2004, 23:16
Zitat von Chewie:
Mal unabhängig davon ob es zwei Einträge gibt, die völlig identisch sind oder nicht: Eine Zahl mit einer anderen zu vergleichen geht doch viel schneller und einfacher als zu kucken, ob der Name gleich ist, wenn ja, dann die Adresse, wenn die wieder gleich ist, dann die Telefonnummer usw.
Du hast das Prinzip nicht verstanden. Natürlich, ich kann die ID vergleichen:
Delphi-Quellcode:
id := 1;
node := xmldoc.selectNode('//kontakt[id="' + id + '"]');
Ich kann aber die Abfrage auch so gestalten:
Delphi-Quellcode:
node := xmldoc.selectNode('//kontakt[' +
  'vorname="Mathias" and name="S." and ort="F. bei C."]');
Das kommt auf selbe raus, weil es auch bloß eine Abfrage ist. Und es funktioniert, weil die zu prüfenden Knoten (in dem Fall mal die fiktiven "name", "vorname" und "ort") dem "kontakt"-Knoten untergeordnet sind. Und genau das habe ich aber eigentlich auch schon gesagt:

Zitat:
[...] und das sucht (wenn ich was bearbeiten muss) nach dem Knoten und zieht dabei sowohl Titel als auch Beschreibung zum Vergleich heran.
klassische UND-Verknüpfung.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:43 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz