Код:
const
XML_FILE_NAME = 'c:\xmlfile.xml';
function TForm1.OpenFile: TXMLDocument;
begin
try
Result := TXMLDocument.Create(XML_FILE_NAME);
Result.Active := True;
except
on E: Exception do
begin
ShowMessage('Ошибка открытия файла ' + XML_FILE_NAME +''#13#13 + E.Message);
if Result <> nil then
Result.Free;
Result := nil;
end;
end;
end;
procedure TForm1.btnRead1Click(Sender: TObject);
var
XML : TXMLDocument;
Nodes : IXMLNodeList;
PageNode,
ChildNode : IXMLNode;
begin
XML := OpenFile;
if XML = nil then Exit;
// Найти первый узел <page>.
// Предполагается, что все узлы <page> лежат на одном уровне.
Nodes := XML.DocumentElement.ChildNodes;
PageNode := Nodes.FindNode('page');
while (PageNode <> nil)
and (PageNode.NodeName = 'page')
and (PageNode.Attributes['id'] <> '1') do
PageNode := PageNode.NextSibling;
// Если PageNode не nil - значит нашли нужный.
// Если nil - значит такого узла нет.
if PageNode <> nil then begin
// Получаем дочерние узлы
Nodes := PageNode.ChildNodes;
// Начиная от первого выводим в Memo1 значения
ChildNode := Nodes.First;
while ChildNode <> nil do begin
Memo1.Lines.Add(ChildNode.Text);
ChildNode := ChildNode.NextSibling;
end;
end;
end;
Это на первый пункт. Остальные два совершенно аналогично делаются, думаю, теперь разберетесь.
UPD: А если на первом уровне не только узлы <page>, то цикл поиска узла надо переписать:
Код:
while (PageNode <> nil) do
if (PageNode.NodeName <> 'page') or (PageNode.Attributes['id'] <> '1') then
PageNode := PageNode.NextSibling
else
break;