Текущий архив: 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.46 MB
Время: 0.007 c