Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi array als xml speichern (https://www.delphipraxis.net/121681-array-als-xml-speichern.html)

schwarzer_kaffee 2. Okt 2008 11:59


array als xml speichern
 
hallo.

ich habe zwei arrays:

Koordinatenarray: array[1..12,1..3]of integer;
Linienarray: array[1..12,1..3,1..2] of integer;

Koordinatenarray[i+1,1]:=x;
Koordinatenarray[i+1,2]:=y;
Koordinatenarray[i+1,3]:=i+1; <-- id. des Punktes


Linienarray[Linienzahler,1,1] := Koordinatenarray[q,1] ; <--- x-Anfang
Linienarray[Linienzahler,2,1] := Koordinatenarray[q,2] ; <--- y Anfang
Linienarray[Linienzahler,3,1] := Koordinatenarray[q,3]; <---- Anfangspunkt

Linienarray[Linienzahler,1,2] := Koordinatenarray[q,1] ; <----x-Endpunkt
Linienarray[Linienzahler,2,2] := Koordinatenarray[q,2] ; <----y-Endpunkt
Linienarray[Linienzahler,3,2] := q ; <---- Endpunkt


wie kann ich die arrays als xml speichern, so dass die xml etwa so aussieht?

XML-Code:
<graph>
  <Punkte>
    <ein_Punkt>
      <id>1</id>
      <X>24</X>
      <Y>182</Y>
    </ein_Punkt>
    <ein_Punkt>
      <id>2</id>
      <X>81</X>
      <Y>152</Y>
    </ein_Punkt>
    <ein_Punkt>
      <id>3</id>
      <X>33</X>
      <Y>116</Y>
    </ein_Punkt>
  </Punkte>
  <wege>
    <von>
      <begin_id>1</begin_id>
      <beginx>24</beginx>
      <beginy>182</endx>
    </von>
    <bis>
      <begin_id>2</begin_id>
      <endx>81</beginx>
      <endy>152</endx>
    </bis>
    <von>
      <begin_id>2</begin_id>
      <beginx>81</beginx>
      <beginy>152</endx>
    </von>
    <bis>
      <begin_id>3</begin_id>
      <endx>33</beginx>
      <endy>116</endx>
    </bis>
    <von>
      <begin_id>3</begin_id>
      <beginx>33</beginx>
      <beginy>116</endx>
    </von>
    <bis>
      <begin_id>1</begin_id>
      <endx>24</beginx>
      <endy>182</endx>
    </bis>
  </wege>
</graph>
ich weiß jetzt nicht ob ich damit mein problem genau genug beschrieben habe^^
falls es nicht so sein sollte, erkläre ich es noch genauer


vielen Dank

schwarzer_kaffee

Reinhardtinho 2. Okt 2008 12:01

Re: array als xml speichern
 
Wenn du die JEDI-Komponenten installiert hast, kannst du dir mal TJvSimpleXML angucken, damit lässt sich eine XML-Datei relativ einfach erstellen.

€dit: Herzlich Willkommen in der dp! :hi: :dp:

schwarzer_kaffee 2. Okt 2008 14:51

Re: array als xml speichern
 
hi Reinhardtinho,

leider benutze ich Turbo Delphi. Bei der kann man keine Komponenten von Fremdanbietern hinzufügen.
von daher werde ich das wohl ohne zusätzliche komponenten machen müssen.

mirage228 2. Okt 2008 15:03

Re: array als xml speichern
 
Hi,

Schau mal ob du die Komponente "TXMLDocument" bzw. die Units XmlIntf, XmlDoc und/oder XmlDom hast.

schwarzer_kaffee 2. Okt 2008 18:36

Re: array als xml speichern
 
die komponente und die units sind vorhanden. ich hab auch noch msxmldom, falls die auch gebraucht werden sollte ^^

sx2008 2. Okt 2008 21:04

Re: array als xml speichern
 
Fang' im Kleinen an und baue daraus die XML-Datei auf. (Bottom-Up-Design)
Also erst mal ein "Punkt"-Element erzeugen:
Delphi-Quellcode:
procedure TForm1.CreatePunkt(parent:IXMLDOMElement; id,x,y:integer);
var
  element, e2 : IXMLDOMElement;
begin
   element := parent.CreateElement('ein_Punkt') as IXMLDOMElement;
   parent.AppendChildNode(element);

   e2 := element.CreateElement('Id') as IXMLDOMElement;
   element.AppendChildNode(e2);
   e2.Text := IntToStr(id);

   e2 := element.CreateElement('X') as IXMLDOMElement;
   element.AppendChildNode(e2);
   e2.Text := IntToStr(x);
   ...
end;
Der Code ist ungetestet und du musst sicher noch etwas anpassen, aber der Knackpunkt ist,
dass du immer eine Procedure hast, die als Parameter ein Vaterelement (parent) übergeben bekommt.

Tip #2: die Methoden CreateElement und AppendChildNode brauchst du so oft, dass du dir eine Funktion schreiben solltest, die beides zusammenfasst.

Tip #3: definiere für deine Arrays einen Datentyp, damit du die Arrays bequem als Parameter übergeben kannst.
Delphi-Quellcode:
type
TKoordinaten = array[1..12,1..3]of integer;
TLinienarray = array[1..2] of TKoordinaten; // cool, wie man mit Pascal Datentypen wiederverwenden kann

schwarzer_kaffee 5. Okt 2008 09:23

Re: array als xml speichern
 
hi

vielen dank für deine hilfe.
leider hat dein array, so wie es da steht, nicht funtkioniert. allerdings habe ich so ganz gut verstanden wie man eine xml datei aufbaut.
ich habe dein code mal als vorlage benutzt und dann so weit rumexperimentiert, bis ich immerhin schon mal die punkte aus dem koordinatenarray speichern kann ^^

das sieht im moment so aus:

Delphi-Quellcode:
  procedure TForm1.Button1Click(Sender: TObject );
var
    id ,id2,x:integer  ;
  xmldocument1: txmldocument;linienid,punktid, xwerte2,linien,von,bis,xwerte, ywerte, element, element2, element3, punkte:ixmlnode;

  begin
    id:=1;
    id2:=0;
    xmldocument1:=txmldocument.Create(nil);
    xmldocument1.Active:=true;

   element:= xmldocument1.addChild('array2xml');
   element.Attributes['app']:= paramstr(0);
   element2:=element.addChild('Koordinaten');
   element2.attributes['aus'] := 'Koordinatenarray';
      while id<11 do
      begin
        punkte:=element2.addchild('ein_punkt');
//        punkte.Attributes['nr'] := inttostr(id);
        punktid:=punkte.addchild('id');
        punktid.text:= inttostr(id);
        xwerte:=punkte.addChild('x');
        xwerte.Text:=inttostr(koordinatenarray[id,1]);
//        xwerte.attributes['x'+inttostr(id)] := koordinatenarray[id,1];
        ywerte:=punkte.addchild('y');
        ywerte.Text:=inttostr(koordinatenarray[id,2]);
//        ywerte.attributes['y'+inttostr(id)]:= koordinatenarray[id,2];
        id:=id+1;
      end;
    element3:=element.addchild('Linien');
    element3.attributes['aus']:= 'Linienarray';
      while id2<11 do
      begin

         linien:=element3.addchild('eine_Linie');
//         linien.Attributes['Nr.'] := inttostr(id2+1);
         linienid:=linien.addchild('id');
         linienid.Text:= inttostr(id2+1);
         von:=linien.addChild('von');
         von.Text:=inttostr(linienarray[id2,3,1]);
//         von.attributes['punkt'+inttostr(id2)] := linienarray[id2,3,1];
         bis:=linien.addchild('bis');
         bis.Text:=inttostr(linienarray[id2,3,2] );
//         bis.attributes['punkt'+inttostr(id2)]:= linienarray[id2,3,2];
         id2:=id2+1;
      end;

   XMLdocument1.savetofile(changefileext(ParamStr(0), '.xml'));
   xmldocument1:=nil;


end;

damit wären die daten aus dem array in der xml datei gespeichert.
wie bekomme ich die daten aus der xml datei jetzt wieder zurück in die arrays?

schwarzer_kaffee 6. Okt 2008 11:48

Re: array als xml speichern
 
----------update----------


ich kann immerhin schonmal die erste x variable aus der xml auslesen und ins array einfügen.
das sieht dann so aus:

Delphi-Quellcode:
procedure tform1.Button2Click(Sender: TObject);
var
  vbn:integer;
  xmldocument1: ixmldocument;
  getx: IXMLXType;
  array2xml,ein_punkt,id,koordinaten,linien,von,bis,xwerte, ywerte, element, element2, element3, punkte:ixmlnode;
  ladearray: IXMLArray2xmlType;
  blubbel: IXMLKoordinatenType;
    node: ixmlnode;

begin
  xmldocument1 := newXMLDocument;
   if opendialog1.execute then
   begin
  XMLdocument1.loadfromfile(openDialog1.FileName)  ;
    xmldocument1.Active:=true;
    array2xml:=xmldocument1.DocumentElement;
 koordinaten:= array2xml.childnodes['Koordinaten'];
 ein_punkt:= koordinaten.ChildNodes['ein_punkt'] ;
 id:= ein_punkt.ChildNodes['id'];
 xwerte:=ein_punkt.ChildNodes['x'];
 koordinatenarray[1,1]:=strtoint(xwerte.text);
 showmessage(inttostr(koordinatenarray[1,1]));
   end;
end;
jetzt bräuchte ich nur noch 'ne schleife um das für die anderen werte auch machen zu können.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:16 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