![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
XLMDocumnet пройтись по всем нодам.
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]Цикл + Рекурсия