Wyświetlenie zawartość pliku XML w TreeView

0

Cześć.
Chciałem przerobić troszkę swój kod Mam edycję danych xml i wszystko chodzi tylko zamiast podglądu xml w memo chciałem przejść na TreeView
Kod ładowania do TreeView nie ma co się oszukiwać ściągnąłem z netu ale ładuje ładnie dane. Tylko już przy edycji nic się nie zmienia, przeładowuje TreeView ale pozostaje bez zmian a w Memo zmiany są widoczne. Może dlatego że nie pozmieniałem typów z interfejsu XML Data Binding ale na tych Nodach to ja kociokwiku dostaje i nie wie co jest co. Jak by ktoś mógł zerknąć i pomóc będę wdzięczny. A oto cały kod.

XMLIntf: IXMLTransportType;

procedure TForm1.btnLoadXMLClick(Sender: TObject);
var
i:integer;
lCar : IXMLCarType;
 begin
 if OpenDialog1.Execute() then
  begin
  XMLDocument1.Active := True;
  XMLDocument1.LoadFromFile(OpenDialog1.FileName);
  XMLIntf := GetTransport(self.XMLDocument1);
  
  Treeview1.Items.Clear;
  DomToTree(XMLIntf, nil);
  TreeView1.FullExpand;

  for I := 0 to XMLIntf.Cars.Count - 1 do
    begin
      lCar := XMLIntf.Cars.Car[I];
      self.ListBox1.Items.Add(lCar.Type);
    end;
  end;
end;


procedure TForm1.btnEditClick(Sender: TObject);
 var
 i:integer;
begin
i:=Listbox1.Itemindex;
ListBox1.Items[ListBox1.ItemIndex] := Edit1.Text;
XMLIntf.Cars.Car[i].Type:= Edit1.Text;
Memo1.Text := self.XMLDocument1.XML.Text;

  DomToTree(XMLIntf, nil);
  TreeView1.FullExpand;
end;


procedure TForm1.DomToTree (XmlNode: IXMLNode; TreeNode: TTreeNode);
var
  I: Integer;
  NewTreeNode: TTreeNode;
  NodeText: string;
  AttrNode: IXMLNode;
begin

  if XmlNode.NodeType <> ntElement then
    Exit;

  NodeText := XmlNode.NodeName;
  if XmlNode.IsTextElement then
   NodeText := NodeText + ' = ' + XmlNode.NodeValue;
  NewTreeNode := TreeView1.Items.AddChild(TreeNode, NodeText);

  for I := 0 to xmlNode.AttributeNodes.Count - 1 do
  begin
    AttrNode := xmlNode.AttributeNodes.Nodes[I];
    TreeView1.Items.AddChild(NewTreeNode,
      '[' + AttrNode.NodeName + ' = "' + AttrNode.Text + '"]');
  end;

  if XmlNode.HasChildNodes then
    for I := 0 to xmlNode.ChildNodes.Count - 1 do
      DomToTree (xmlNode.ChildNodes.Nodes [I], NewTreeNode);
end;

0

A jakieś SaveToFile wywołujesz gdzieś bo w tym kodzie raczej nie widzę.

0

Tak planowo tak ale jeszcze do tego nie doszedłem na razie ogarniam edycję, chyba że by ktoś chciał poświecić swój czas i zrobić przykład było by super ale najważniejsze jest problem z TreeView z wyświetleniem z mian po edycji

0

No to może spróbuj przed załadowaniem do TreeView jakieś Active dokumentu dla odświeżenia.

0

Ale debil ze mnie Problem rozwiązany wystarczyło dać Treeview1.Items.Clear; a w Memo jest Memo1.Text := self.XMLDocument1.XML.Text;
z text na końcu co automatycznie zamienia tekst w memo Ale dziękuję bo mi to nadsunąłeś. Post można wyrzucić do kosza. Przepraszam za kłopot

0

Witajcie ponownie.
Piszę bo mam mały problemik dalej z TreeView. A mianowicie, wrzuciłem RadioGroup na forme i mam takie wybory - podgląd Xml w Memo, podgląd w TreView i Brak podglądu(ustawiony domyślnie). Za wybory odpowiada funkcja Case of. I tak ładuje dane z pliku które lądują w Listboxie i teraz za pierwszym razem odhaczając podgląd w TreView działa ale potem przełączając się między wybory i zmieniając zaznaczony item w listboxie gdy chcę znów wrócić na podgląd w TreeView wyskakuje błąd
** Could not convert variant of type (null) into type (OleStr) **
Jak temu zaradzić ? i jeśli są inne uwagi do kodu co mogło by być lepiej też bardzo proszę

a oto cały RadioGroup:

procedure TForm1.RadioGroupXMLClick(Sender: TObject);
begin
  case RadioGroupXML..ItemIndex of
  0:
    begin
    Memo1.Visible:=True;
    TreeView1.Visible:=False;
    Memo1.text := XMLDocument1.xml.Text;
    end;
  1:
    begin
    Memo1.Visible:=False;
    TreeView1.Visible :=True;
    Treeview1.Items.Clear;
    DomToTree(XMLIntf, nil);
    TreeView1.FullExpand;
    end;
  2:
    begin
    Memo1.Visible:=False;
    TreeView1.Visible:=False;
    end
  end;
end;

A teraz jeszcze raz całość:


XMLIntf: IXMLTransportType;
 
procedure TForm1.btnLoadXMLClick(Sender: TObject);
var
i:integer;
lCar : IXMLCarType;
 begin
 if OpenDialog1.Execute() then
  begin
  XMLDocument1.Active := True;
  XMLDocument1.LoadFromFile(OpenDialog1.FileName);
  XMLIntf := GetTransport(self.XMLDocument1);
 
  Treeview1.Items.Clear;
  DomToTree(XMLIntf, nil);
  TreeView1.FullExpand;
 
  for I := 0 to XMLIntf.Cars.Count - 1 do
    begin
      lCar := XMLIntf.Cars.Car[I];
      self.ListBox1.Items.Add(lCar.Type);
    end;
  end;
end;
 
procedure TForm1.btnEditClick(Sender: TObject);
 var
 i:integer;
begin
i:=Listbox1.Itemindex;
ListBox1.Items[ListBox1.ItemIndex] := Edit1.Text;
XMLIntf.Cars.Car[i].Type:= Edit1.Text;
Memo1.Text := self.XMLDocument1.XML.Text;
 
  DomToTree(XMLIntf, nil);
  TreeView1.FullExpand;
end;
 
procedure TForm1.DomToTree (XmlNode: IXMLNode; TreeNode: TTreeNode);
var
  I: Integer;
  NewTreeNode: TTreeNode;
  NodeText: string;
  AttrNode: IXMLNode;
begin
 
  if XmlNode.NodeType <> ntElement then
    Exit;
 
  NodeText := XmlNode.NodeName;
  if XmlNode.IsTextElement then
   NodeText := NodeText + ' = ' + XmlNode.NodeValue;
  NewTreeNode := TreeView1.Items.AddChild(TreeNode, NodeText);
 
  for I := 0 to xmlNode.AttributeNodes.Count - 1 do
  begin
    AttrNode := xmlNode.AttributeNodes.Nodes[I];
    TreeView1.Items.AddChild(NewTreeNode,
      '[' + AttrNode.NodeName + ' = "' + AttrNode.Text + '"]');
  end;
 
  if XmlNode.HasChildNodes then
    for I := 0 to xmlNode.ChildNodes.Count - 1 do
      DomToTree (xmlNode.ChildNodes.Nodes [I], NewTreeNode);
end;

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