Показать сообщение отдельно
  #12  
Старый 03.01.2008, 16:18
Rosenkrantz Rosenkrantz вне форума
Активный
 
Регистрация: 04.12.2007
Адрес: Москва
Сообщения: 234
Версия Delphi: Delphi 7
Репутация: 40
По умолчанию

Код:
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;  
Ответить с цитированием