Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

XLMDocumnet пройтись по всем нодам.


Страницы:   1 2

Den ©   (2012-12-18 18:45:00) 

В общем есть XML документ в нем ноды есть, у некоторых нод есть чайлд ноды, как пройтись по всем нодам в цикле? Тоесть чтоб цикл зашел в каждую и прочитал значение атрибута name к примеру?


RWolf   (2012-12-18 20:45:00) [21]

она и знает — всё на стеке лежит.


Den   (2012-12-18 20:10:00) [22]

Я понимаю что она сама себя вызывает, моя не понимать как она по всем папкам идет и не зацикливается на одной левой ветке дерева. Онаж должна знать как-то что вот эту дерикторию отметили всю, больше там нечего делать, надо смотреть в другую, если она есть и так далее.


Медвежонок Пятачок   (2012-12-18 19:55:00) [23]

не знаю зачем тебе ф8 для понимания рекурсии.

достаточно рассмотреть один единственный иф и все.

если <что-то> зен функция вызывает саму себя.


Den   (2012-12-18 19:34:00) [24]

Медвежонок Пятачок не да спасибо, я просто заодно с этим разобраться хотел, никак не могу понять как оно работает, сижу вот пошагово смотрю по f8 как оно фурычит может дойдет наконец

Procedure GetDirList(InitialDir:String; DirList:TStrings);
Var
Info:TSearchRec;
InitialDirPartOne,InitialDirPartTwo :string;
Begin
InitialDirPartOne:=InitialDir + '\*.';
If FindFirst(InitialDirPartOne, faDirectory, Info) = 0 Then Begin
If (Info.Name <> '.') And (Info.Name <> '..') Then Begin
InitialDirPartTwo:=InitialDir + '\' + Info.Name;
DirList.Add(InitialDirPartTwo);
GetDirList(InitialDirPartTwo, DirList);
End;

While FindNext(Info) = 0 Do
If (Info.Name <> '.') And (Info.Name <> '..') Then Begin
InitialDirPartTwo:=InitialDir + '\' + Info.Name;
DirList.Add(InitialDirPartTwo);
GetDirList(InitialDirPartTwo, DirList);
End
End;
FindClose(Info)
End;


Медвежонок Пятачок   (2012-12-18 19:22:00) [25]

uses ComObj;

...

var xdoc,xlist : OleVariant; i : integer;
begin
xdoc := CreateOleObject('Msxml2.DOMDocument');
xdoc.loadXML('<root><вася/><петя/><маша><глаша/></маша></root>');
xlist := xdoc.selectNodes('//*');
for i := 0 to Pred(integer(xlist.length)) do ShowMessage('Здравствуйте, я узел ' + xlist.item[i].nodeName);
end;


Медвежонок Пятачок   (2012-12-18 19:09:00) [26]

Рекурсия.... ктото может на пальцах обяснить как это должно работать?

не слушай плохиша.
он тебя плохому научит.


brother   (2012-12-18 19:05:00) [27]

http://www.stihi.ru/pics/2009/09/20/4211.jpg
а еще точнее:
http://borlpasc.narod.ru/docym/recyr.htm


Den   (2012-12-18 19:03:00) [28]

ага! Пока пост сочинял уже есть то что я хотел понять.


Den   (2012-12-18 19:02:00) [29]

Рекурсия.... ктото может на пальцах обяснить как это должно работать? К примеру есть дерево из нодов, они одинаковые, как рекурсия будет знать что эту ноду к примеру уже проходили? Это надо же чтото записывать о ней типа сюда не ходи тут уже были.. А че записывать то? В html sourceindex есть это уникальный номер элемента в таблице, а тут как?

Медвежонок Пятачок спасибо буду юзать этот вариант но с рекурсией хочу понять всетаки как оно работает. Ответ типа - чтоб понять принцып рекурсии, нужно понять принцып рекурсии, не предлагать:)


Медвежонок Пятачок   (2012-12-18 19:01:00) [30]

type
TXMLNodeEnumCallBack = function(iNode : IXMLDOMNode; var bMore : boolean; ACustomData : Pointer) : boolean of object;

function xml_EnumXMLDOMNodeList(iBaseNode : IXMLDOMNode; const AXPath : string; ACallback : TXMLNodeEnumCallBack; ACustomData : Pointer) : integer;
var bMore : boolean; i : integer; iList : IXMLDOMNodeList;
begin
Result := 0; bMore := True;
if (iBaseNode <> nil) then
 begin
  iList := iBaseNode.selectNodes(AXPath);
  if (iList <> nil) and (iList.length > 0) and Assigned(ACallBack)then
   begin
    for i := 0 to Pred(iList.length) do
     begin
      if ACallback(iList.item[i],bMore,ACustomData) then Inc(Result);
      if not bMore then Break;
     end;
   end;
 end;
end;


Медвежонок Пятачок   (2012-12-18 18:51:00) [31]

xdoc.selectNodes('//*'); + просто цикл без рекурсии

Но только не TXMLDocument.
Он упрощенный. Для дошколят.


Плохиш   (2012-12-18 18:48:00) [32]

Цикл + Рекурсия


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо