![]() |
Unterschiedliche Record-Strukturen in XML speichern
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:
Und dann die ganzen Datensätze als Records.
type
TXMLFile = record FVerMajor: Cardinal; FVerMinor: Cardinal; FDate: TDate; FTime: TTime; FNextRecordID: Cardinal; FRecordCount: Cardinal; end;
Delphi-Quellcode:
Jetzt die Frage: Ist das ohne weiteres möglich oder muss man da irgendwelche Klimmzüge für machen?
type
TKontakt = record Name: String; Vorname: String; ...: ...; ...: ...; end; |
Re: Unterschiedliche Record-Strukturen in XML speichern
Zitat:
Zitat:
Zitat:
Zitat:
Code:
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:
<?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>
Delphi-Quellcode:
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.
kontakte := xmldoc.selectNodes('/adressen/kontakt');
// kontakte = IXMLDOMNodeList 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. |
Re: Unterschiedliche Record-Strukturen in XML speichern
Ein PS:
Zitat:
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. |
Re: Unterschiedliche Record-Strukturen in XML speichern
Zitat:
Zitat:
Zitat:
Zitat:
|
Re: Unterschiedliche Record-Strukturen in XML speichern
Zitat:
Zitat:
Zitat:
Delphi-Quellcode:
ShowMessage(inttostr(kontakte.length));
Zitat:
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. ;) |
Re: Unterschiedliche Record-Strukturen in XML speichern
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. |
Re: Unterschiedliche Record-Strukturen in XML speichern
Fürs Hochladen kannst evtl. auch was mit PHP machen, das du über dein Programm steuerst..
Auf ![]() |
Re: Unterschiedliche Record-Strukturen in XML speichern
@Luckie: Ich wollte keine Vorschriften machen. Ich habe nur versucht, deine Grundsatzfragen zu beantworten. Speziell
Zitat:
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:
Aber wie gesagt, solche Sachen können wir immer noch klären wenn dein Programm schon ein wenig Form angenommen hat. |
Re: Unterschiedliche Record-Strukturen in XML speichern
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.
|
Re: Unterschiedliche Record-Strukturen in XML speichern
Zitat:
Delphi-Quellcode:
Ich kann aber die Abfrage auch so gestalten:
id := 1;
node := xmldoc.selectNode('//kontakt[id="' + id + '"]');
Delphi-Quellcode:
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:
node := xmldoc.selectNode('//kontakt[' +
'vorname="Mathias" and name="S." and ort="F. bei C."]'); Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:37 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