Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.04.2012, 19:30   #1
maximumtf2
 
Регистрация: 08.01.2010
Сообщений: 5
Восклицание Построение TreeView из XML

Здравствуйте! Уважаемые, подскажите пожалуйста как из такого XML-файла построить дерево в TreeView с помощью стандартных средств Делфи.
Код:
<group name="WORKGROUP" Level="0">
<computer name="comp1" ip="10.10.10.1" level="1"/>
<computer name="comp2" ip="10.10.10.2" level="1"/>
<computer name="comp3" ip="10.10.10.3" level="1"/>
</group>
Никогда с XML не работал, но сейчас это очень нужно.
Спасибо за внимание.
maximumtf2 вне форума Ответить с цитированием
Старый 07.04.2012, 11:28   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Гуглим, товарищ.
http://www.webdelphi.ru/2010/02/poka...vide-treeview/
phomm на форуме Ответить с цитированием
Старый 09.04.2012, 08:53   #3
maximumtf2
 
Регистрация: 08.01.2010
Сообщений: 5
По умолчанию

Спасибо. Там дерево строится по значениям и есть функция отображения атрибутов. Но там не описывается как строить дерево по атрибутам. Дело в том что в моем xml файле нет значений вообще...
maximumtf2 вне форума Ответить с цитированием
Старый 09.04.2012, 09:40   #4
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Атрибуты вычленяются когда NodeType = ntAttribute
или вот ещё здесь смотрим http://docwiki.embarcadero.com/VCL/X...AttributeNodes (которая есть, пожалуй, неизменная версия оной же страницы из справки дельфи7 или даже ещё раньше :D)

Думаю если приложите старания то доведёте до нужной кондиции тот или подобный пример.

А вообще я когда первый ответ постил - я посмотрел разные готовые варианты в сети и опробовал их на своём одном проекте с XML - какие-то были более продуктивные, какие-то менее, но ни одного не было в виде "blackbox" т.е. готового инструмента (класса, например).
Я там один скаченный покромсал для большей универсальности, кое-где подшаманил, чтобы у себя в проекте норм запустилось. Но вот чтобы работало со всеми типами нод - это надо сильно расширять, т.е. чтобы добавить помимо самого узла и его значения ещё и атрибуты - надо поработать.

Как я это вижу - имеем ноду (для показа в древовиде) - имя её = имени в хмлноде, в ней 3 субзначения: 1е валью, 2 - набор атрибутов (который раскрывается и выглядит в виде пар ключ=значение) и 3 - подноды данной ноды.
Придётся намутить некислую рекурсию и наверное на конечном автомате ещё для обхода всего этого добра. Плюс так-то типов нод ещё больше (всякие #document #comment и т.п.) если ещё их поддержку делать...
phomm на форуме Ответить с цитированием
Старый 10.04.2012, 17:06   #5
maximumtf2
 
Регистрация: 08.01.2010
Сообщений: 5
По умолчанию

Нашел вроде простой алгоритм, в котором строится дерево по атрибутам с помощью XMLDOM. НО, при запуске выкидывает Access violation с указанием на строку присвоения iNode. Хотя и iNode и firstChild одного типа. Подскажите в чем может быть проблема.

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,XmlDoc,XMLIntf, StdCtrls, sButton, ComCtrls, sTreeView,MSXML2_TLB;

type
  TForm1 = class(TForm)
    sTreeView1: TsTreeView;
    sButton1: TsButton;
    procedure sButton1Click(Sender: TObject);
    procedure XML2Tree(tree: TTreeView; XMLDoc: IXMLDOMDocument);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  doc: IXMLDOMDocument;

implementation

{$R *.dfm}

procedure TForm1.sButton1Click(Sender: TObject);
begin
 doc:=CoDOMDocument.Create;
 doc.loadXML('C:\file.xml');
 XML2Tree(sTreeView1,doc);
end;

procedure TForm1.XML2Tree(tree: TTreeView; XMLDoc: IXMLDOMDocument);
var
  iNode: IXMLDOMNode;
  procedure ProcessNode(Node: IXMLDOMNode; TreeNode: TTreeNode);
  var
    cNode: IXMLDOMNode;
    s: string;
  begin
    if Node = nil then Exit; // выходим если конец документа

    // добавляем узел в дерево
      s:=Node.Attributes[0].NodeValue;
    TreeNode := tree.Items.AddChild(TreeNode, s);
    // переходим к дочернему узлу
    cNode := Node.FirstChild;
    // проходим по всем дочерним узлам
    while cNode <> nil do
    begin
      ProcessNode(cNode, TreeNode);
      cNode := cNode.NextSibling;
    end;
  end;

begin
  iNode := XMLDoc.DocumentElement.FirstChild;
  while iNode <> nil do
  begin
    ProcessNode(iNode, nil); // рекурсия
    iNode := iNode.NextSibling;
  end;
end;

end.

Последний раз редактировалось maximumtf2; 10.04.2012 в 17:34.
maximumtf2 вне форума Ответить с цитированием
Старый 10.04.2012, 23:15   #6
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

После doc.loadXML('C:\file.xml');
Поставьте doc.active := true;
Если не поможет, киньте проект с тестовым хмл - погоняю.
phomm на форуме Ответить с цитированием
Старый 10.04.2012, 23:18   #7
maximumtf2
 
Регистрация: 08.01.2010
Сообщений: 5
По умолчанию

там нету такого свойства. Нашел выход: заменить doc.loadXML на doc.load
Хотя я так и не понял в чем разница
phomm, спасибо за внимание

Последний раз редактировалось maximumtf2; 10.04.2012 в 23:28.
maximumtf2 вне форума Ответить с цитированием
Старый 10.04.2012, 23:32   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

помему LoadXML это метод загрузки из строки(то есть сам XML уже в строковой переменной)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.04.2012, 00:30   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Вот рабочий пример
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, xmldom, XMLIntf, StdCtrls, msxmldom, XMLDoc, ComCtrls;

type
  TForm1 = class(TForm)
    TreeView1: TTreeView;
    XMLDocument1: TXMLDocument;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    procedure GetNodeList(NodeList: IXMLNodeList; TreeNode: TTreeNode);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  XMLDocument1.LoadFromFile('e:\Otladka.xml');
  GetNodeList(XMLDocument1.ChildNodes,nil);
  TreeView1.FullExpand;
end;

procedure TForm1.GetNodeList(NodeList: IXMLNodeList; TreeNode: TTreeNode);
var i,j: Integer;
    Node: TTreeNode;
    s: String;
begin
  for i:=0 to NodeList.Count-1 do begin
    if NodeList.Nodes[i].NodeType=ntText then Continue;
    s:=NodeList.Nodes[i].NodeName;
    if NodeList.Nodes[i].IsTextElement then s:=s+': '+NodeList.Nodes[i].Text;
    Node:=TreeView1.Items.AddChild(TreeNode,s);
    for j:=0 to NodeList.Nodes[i].AttributeNodes.Count-1 do begin
      s:=NodeList.Nodes[i].AttributeNodes.Nodes[j].NodeName+'='+
         NodeList.Nodes[i].AttributeNodes.Nodes[j].NodeValue;
      TreeView1.Items.AddChild(Node,s);
    end;
    if NodeList.Nodes[i].HasChildNodes then GetNodeList(NodeList.Nodes[i].ChildNodes,Node);
  end;
end;


end.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TreeView сохранить в xml использую linq iukash C# (си шарп) 3 24.07.2011 16:45
построение XML сложной структуры с помощью nativeXML adben Общие вопросы Delphi 2 29.07.2010 07:06
Проблема при загрузке файла XML в TreeView artemavd Общие вопросы Delphi 1 20.06.2010 15:39
Добавление узлов в XML в Delphi, исользуя Treeview Анастасия999 Помощь студентам 0 08.05.2010 10:05
вывод xml данных из TreeView в webbrowser Dr.XxX Общие вопросы Delphi 1 10.10.2008 12:06