![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
XML, Ноды, Рекурсия? [D6, XP]
timekiller © (2008-03-18 19:37:00)Есть XMLный файл, в нем много много элементов и узлов, уходящих на километр в огромные ветви (1, 2, 3 .. n-й уровень)
Намекните, как сделать функцию (Это называется рекурсия?)
Невозможно все перечислить одними TXMLDocument.ChildNodes[x].ChildNodes[y].ChildNodes[z].....ChildNodes[n]..... и тд
С чего начать?
Тоесть надо зациклить цикл циклов, порождающих циклы дальше ...
timekiller (2008-03-19 20:19:00) [1]
> Ega23 © (19.03.08 11:34) [4]
ок, буду начинать думать.) спасип!
Reindeer Moss Eater (2008-03-19 12:01:00) [2]XML без XPATH это примерно как сидеть на оракле и пользоваться только TTable.
Ega23 (2008-03-19 11:34:00) [3]А если подумать? Ну совсем чуть-чуть?
if (UpperCase(XMLNode.NodeName) = 'TEXT') or
(UpperCase(XMLNode.NodeName) = 'DATE')) then
begin
end
else
Continue;
timekiller (2008-03-19 11:29:00) [4]
> Ega23 © (18.03.08 19:47) [1]
Отличное дерево, неналюбуюс ...... :) только я промахнулся, составив непрально вопрос..
вощм.. надо перебрать и выцедить определенные узлы, например <text> и <date> среди огромного количества всяких <label>,<separator> итд ................
Reindeer Moss Eater (2008-03-19 00:39:00) [5]Невозможно все перечислить одними TXMLDocument.ChildNodes[x].ChildNodes[y].ChildNodes[z].....ChildNodes[n]..... и тд
Нужно курить XPath. Тогда перечислишь все что хочешь одним выражением.
Ega23 (2008-03-18 19:47:00) [6]
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;