Aktualizacja danych w pliku XML

0

Witam, jak zaktualizować już istniejące dane w pliku xml?

procedure tform1.wczytaj(identyfikator,zm1,zm2,zm3,zm4,zm5,zm6 : String );
begin
XMLNode := XML.DocumentElement.AddChild(identyfikator); // Dodanie daty z kalendarza
  XMLValues := XMLNode.AddChild('t1'); // Dodanie wartości
  XMLValues.Text := zm1;
  XMLValues := XMLNode.AddChild('t11'); 
  XMLValues.Text := zm2; 
  XMLValues := XMLNode.AddChild('t2');
  XMLValues.Text := zm3; 
  XMLValues := XMLNode.AddChild('t22'); 
  XMLValues.Text := zm4; 
  XMLValues := XMLNode.AddChild('t3');
  XMLValues.Text := zm5; 
  XMLValues := XMLNode.AddChild('t33');
  XMLValues.Text := zm6;

procedure TForm1.MonthCalendar1DblClick(Sender: TObject);
var
  d : TDate;
  t, kontrolka1 : Integer;
begin
d:=MonthCalendar1.Date;
ID  := 'db' + DateToStr(d);
Form1.Caption:=ID;

//Sprawdzam czy istnieje tag = ID, jeżeli tak to odczytuje pola do editow,
//jeżeli nie to tworze tag = ID i czyszcze edity.
//----------------------------------------------------------------
kontrolka1:=0;
  For t:=0 to xml.DocumentElement.ChildNodes.Count-1 do
  begin
    If xml.DocumentElement.ChildNodes[t].LocalName = ID then
      kontrolka1:=1;
  end;
  if kontrolka1 = 1 then
  begin
    Form1.Caption:='Element istnieje.';
    XMLNode.FindNamespaceDecl(ID);
    //tu wczytac dane do editow

    {For t:=0 to xml.DocumentElement.ChildNodes.Count-1 do
      begin

      end; }
  end
  else
    begin
      //dodanie elementu
      wczytaj(id,Edit1.Text,Edit2.Text,Edit3.Text,Edit4.Text,Edit5.Text,Edit6.Text);

    end;
end;
end;


Jak zaktualizować istniejące już dane wg kryterium ID czyli mojej daty, zdaję sobie sprawę gdzie, ale umiem dodać tylko nową wartość, nie mam zielonego pojęcia jak aktualizować już istniejące?

0

Przecież w tym artykule nie ma nic o edycji istniejących danych.

teoretycznie mogę usunąć istniejący wpis i zastąpić go nowym ale czy to jest edycja?

0

A czytałeś całośc uważnie? Ja się słabo znam na XML'u i do jego ogarnięcia korzystałem zwykle z innego modułu spkxmlparser.pas zawierającego klasę TSpkXMLParser. Ale wedle mnie ustawianie atrybutów oraz tekstu przez własnośc Text, które pokazano w tym artykule to właśnie edycja danych. Nie wiem co tam kombinujesz, ale ja bym zrobił coś w stylu jak poniżej. Jako, że słabo ogarniam XML, jak wspomniałem, posłużyłem się tym, co wygooglowałem i tym co bylo pokazane w źródłach komponentu TEasyGG w module egg.pas. Dla porównania są dwa pliki. Problem tylko w przesadnie dużych wcięciąch, ale i to pewnie da się ogarnąć. I zawsze najpierw pogoogluj, pokombinuj sam, a dopiero później pytaj. Bo widzę, że nikt się z odpowiedzią nie wyrywał, także ludzie rzadko pewnie - jak i ja - używają XML pod Delphi. A i oczywiśćie trzeba by dopracować zapis polskich znaków diakrytycznych, jak również można inaczej wyszukiwać węzły i nie zapisywać koniecznie do tego o indeksie zero. I drugi obiekt X2 utworzyłem osobno celowo. Także potestuj całośc sam.

//...
uses
  xmldoc, xmlintf;

procedure TForm1.Button1Click(Sender : TObject);
const
  Xml_FileName = 'D:\test.xml';
var
  XML, X2 : TXMLDocument;
  Root, Group : IXMLNode;
begin
  xML := TXMLDocument.Create(Self);
  XML.Options := [doNodeAutoIndent];
  XML.Active := True;
  XML.AddChild('ContactBook');
  Root := XML.DocumentElement.AddChild('Groups');
  Group := Root.AddChild('Group');
  Group.AddChild('Id').Text := '00000000-0000-0000-0000-000000000000';
  Group.AddChild('Name').Text := 'Pozostałe';
  Group.AddChild('IsExpanded').Text := 'true';
  Group.AddChild('IsRemovable').Text := 'false';
  Group := Root.AddChild('Group');
  Group.AddChild('Id').Text := '00000000-0000-0000-0000-000000000001';
  Group.AddChild('Name').Text := 'Ignorowani';
  Group.AddChild('IsExpanded').Text := 'false';
  Group.AddChild('IsRemovable').Text := 'false';
  XML.SaveToFile(Xml_FileName);
  XML.Free;
  x2 := TXMLDocument.Create(Self);
  X2.Active := True;
  X2.LoadFromFile(Xml_FileName);
  Root := X2.DocumentElement.ChildNodes.FindNode('Groups');
  if Root <> nil then
  begin
    Group := Root.ChildNodes.FindNode('Group');
    if Group.ChildNodes[0] <> nil then
    begin
      Group.ChildNodes['Name'].Text := 'ZMIENIONY';
    end;
  end;
  X2.SaveToFile(ChangeFileExt(Xml_FileName, '_po_zmianach.xml'));
  X2.Free;
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1