Operacje na drzewie, dodawanie atrybutów.

0

Witam,
Mam do zrobienia drzewo, które będzie przechowywać elementy xml. Dodawanie tagów, poruszanie się po drzewie mam zrobione. Problem pojawia się przy dodaniu atrybutów. Kompletnie nie mam na to pomysłu. Chodzi o to aby była możliwość dodania do każdego tagu min. 1 atrybutu który składa się z nazwy i wartosci. Musi to być na liście, w sensie że od tagu będzie wskaźnik na listę z atrybutami. Typ bazowy aktualnie wygląda tak:

type
  Ptag = ^tag;
  tag = record
    name,tresc:string;
    down,up,right,left: Ptag;
  end;

Ma ktoś jakiś pomysł ?

0

Lista atrybutów jako sparowanych nazw z wartościami będąca polem twojego "znacznika xml".

0

Hmm, nie bardzo mi to rozjaśnia. Mógłbyś podać jakiś kod ?

1

No zrób normalną mapę* nazwa-wartość, o to jak mniemam chodzi @spartanPAGE.
* zakładając, że nazwy atrybutów są unikatowe w obrębie znacznika (a w xmlu afair tak jest).

0

Czy ma to być na takiej zasadzie, że lista będzie się składać z 3 pól typu string, nazwa_tagu, nazwa_atrybutu i wartosc_atrybutu i kolejne pola to wskaźniki. Lista będzie powiązana z drzewem w takim sensie, że będzie się dodawać aktualną nazwę tagu do którego chcemy dodać atrybut?

0

Co, co, co?

Type
  TAttributeList = 
  Array of Record
    Name, Value: String;
  End;

Type
  PTag = ^TTag;
  TTag =
  Record
    Name, Content: string;
    Down, Up, Right, Left: PTag;
    Attributes: TAttributeList;
  End;

W uproszczeniu o coś takiego mi chodziło (choć tutaj nie ma zastosowanej mapy, ale mniejsza).

0

Hmm, ten typ bazowy raczej mi nie daje możliwości dodania dynamicznej ilości atrybutów.

0

Jak to nie?
Przecież masz tablicę - albo ja już zgłupiałem i nie widzę, o co Ci chodzi.

0

Muszę to zrobić w turbo pascalu. Tablice tam nie są dynamiczne. Mogę jedynie określić ile ma mieć elementów i tyle. Dlatego muszę zrobić to w oparciu o listę.

1

Ojacie, Turbo Pascal? Gdzie tego jeszcze wymagają? :D
Możesz je zasymulować - http://www.delphigroups.info/2/0b/66945.html - nic trudnego, a i czytelne.

0

PŚK się kłania... Zrobiłem w ten sposób że dodawanie atrybutów jest do listy dwukierunkowej, która przechowuje nazwę tagu, nazwe atrybutu i wartosc. Zdaje mi się że nie o to chodziło ale działa ;)

0

Mam jeszcze jeden problem. Usuwanie poddrzewa wraz z potomkami. Gdy dodaje do potomka jakies rodzenstwo po prawej stronie to jest ok. Usuwa się bez problemu, ale gdy dodam po lewej to program wywala. Procedurę usuwania znalazłem tutaj na forum. wygląda to tak:

procedure usun_poddrzewo(h:Ptag);
begin
  if h^.nast<>nil then h^.nast^.pop:=h^.pop;
  if h^.pop<>nil then h^.pop^.nast:=h^.nast
  else if h^.rod<>nil then h^.rod^.pot:=h^.nast;
  while h^.pot<>nil do usun_poddrzewo(h^.pot);
  writeln(h^.name);
  readln;
  Dispose(h);
end;  

tak wyglada fragment dodawania na prawa strone:

if s = 1 then begin
     if h^.nast=nil then begin
        h^.nast:=n;
        n^.pop:=h;
     end else begin
         n^.pop:=h;
         n^.nast:=h^.nast;
         h^.nast^.pop:=n;
         h^.nast:=n;
     end;
     dodaj_rodzenstwo := 1;
   end;    

a tak fragment dodawania na lewa strone :

if s = 2 then begin
     if h^.pop=nil then begin
        h^.pop:=n;
        n^.nast:=h;
     end else begin
         n^.nast:=h;
         n^.pop:=h^.pop;
         h^.pop^.nast:=n;
         h^.pop:=n;
     end;
     dodaj_rodzenstwo := 2;
   end; 

jak coś to pop = poprzedni; nast=nastepny; pot=potomek; rod=rodzic :)
Podejrzewam że tu gdzieś musi być błąd. Usuwanie poddrzewa z elementami dodanych na prawą strone jest ok, na lewą już nie :/

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