Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.04.13;
Скачать: CL | DM;

Вниз

XML, Ноды, Рекурсия?   Найти похожие ветки 

 
timekiller ©   (2008-03-18 19:37) [0]

Есть XMLный файл, в нем много много элементов и узлов, уходящих на километр в огромные ветви (1, 2, 3 .. n-й уровень)

Намекните, как сделать функцию (Это называется рекурсия?)
Невозможно все перечислить одними TXMLDocument.ChildNodes[x].ChildNodes[y].ChildNodes[z].....ChildNodes[n]..... и тд

С чего начать?
Тоесть надо зациклить цикл циклов, порождающих циклы дальше ...


 
Ega23 ©   (2008-03-18 19:47) [1]


type
 TForm1 = class(TForm)
   ParamsXMLDoc: TXMLDocument;
   Button1: TButton;
   OpenDlg: TOpenDialog;
   tvXMLTree: TTreeView;
   procedure Button1Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
 private
   procedure ReadParamsXML(const FileName : TFileName);
   procedure ParseXML(TreeNode : TTreeNode; XMLNode : IXMLNode);
 public
   { Public declarations }
 end;

var
 DBConfigForm: TDBConfigForm;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 if not OpenDlg.Execute then Exit;
 ReadParamsXML(OpenDlg.FileName);
end;

procedure TForm1.ParseXML(TreeNode: TTreeNode; XMLNode: IXMLNode);
var
 ss : string;
 i : Integer;
 CurrNode : TTreeNode;
begin
 if XMLNode.IsTextElement then
   ss := XMLNode.Text
 else
   ss := "<" + XMLNode.NodeName + ">";

 for i:=0 to XMLNode.AttributeNodes.Count-1 do
   ss := ss + " : " + XMLNode.AttributeNodes.Nodes[i].Text;

 if TreeNode=nil then
   CurrNode := tvXMLTree.Items.Add(TreeNode, ss)
 else
   CurrNode := tvXMLTree.Items.AddChild(TreeNode, ss);

 //if XMLNode.IsTextElement then Exit;
 
 for i:=0 to XMLNode.ChildNodes.Count-1 do
   ParseXML(CurrNode, XMLNode.ChildNodes.Nodes[i]);
end;

procedure TForm1.ReadParamsXML(const FileName: TFileName);
begin
 ParamsXMLDoc.FileName := FileName;
 try
   ParamsXMLDoc.Active := True;
   tvXMLTree.Items.Clear;
   ParseXML(nil, ParamsXMLDoc.DocumentElement);
 except

 end;
end;


 
Reindeer Moss Eater ©   (2008-03-19 00:39) [2]

Невозможно все перечислить одними TXMLDocument.ChildNodes[x].ChildNodes[y].ChildNodes[z].....ChildNodes[n]..... и тд

Нужно курить XPath. Тогда перечислишь все что хочешь одним выражением.


 
timekiller ©   (2008-03-19 11:29) [3]


> Ega23 ©   (18.03.08 19:47) [1]


Отличное дерево, неналюбуюс ...... :) только я промахнулся, составив непрально вопрос..
вощм.. надо перебрать и выцедить определенные узлы, например <text> и <date> среди огромного количества всяких <label>,<separator> итд ................


 
Ega23 ©   (2008-03-19 11:34) [4]

А если подумать? Ну совсем чуть-чуть?
if (UpperCase(XMLNode.NodeName) = "TEXT") or
  (UpperCase(XMLNode.NodeName) = "DATE")) then
begin

end
else
 Continue;


 
Reindeer Moss Eater ©   (2008-03-19 12:01) [5]

XML без XPATH это примерно как сидеть на оракле и пользоваться только TTable.


 
timekiller ©   (2008-03-19 20:19) [6]


> Ega23 ©   (19.03.08 11:34) [4]

ок, буду начинать думать.) спасип!



Страницы: 1 вся ветка

Текущий архив: 2008.04.13;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.022 c
2-1205506618
Sesh
2008-03-14 17:56
2008.04.13
Компонент


2-1205946440
Hypnotize_X
2008-03-19 20:07
2008.04.13
Компоненты и клавиатура


2-1205902866
snake-as
2008-03-19 08:01
2008.04.13
Проблема с канвасом


3-1195192547
Василий К.
2007-11-16 08:55
2008.04.13
IB в DLL


3-1195444789
Бакук
2007-11-19 06:59
2008.04.13
Слетает &amp;laquo;привязка&amp;raquo; к датамодулю