ReadXML - прочитать из TStream

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
son
новенький
Сообщения: 39
Зарегистрирован: 22.11.2011 11:50:58

ReadXML - прочитать из TStream

Сообщение son »

Доброго всем. Небольшой вопрос. Есть XML документ, который открываю в SynEdit. Его структуру хочу еще распарсить в отдельное дерево. Не получается прочитать документ из текста в SynEdit:

Код: Выделить всё

var XMLDoc : TXMLDocument;
    XMLM   : TMemoryStream;
    ndDef  : TDOMNOde;
    iRow : integer;

begin
  SynEdit3.Text:=PRJClass.FServerConfigFileText.Text;
  tbKUDefense.BeginUpdate;
  tbKUDefense.RowCount:=2;
  tbKUDefense.Rows[1].Clear;
  if PRJClass.ServerConfigFileName<>'' then begin
    XMLM   := TMemoryStream.Create;
    XMLM.Clear;

    SynEdit3.Lines.SaveToStream(XMLM);
    ReadXMLFile(XMLDoc,XMLM);

    //ReadXMLFile(XMLDoc,PRJClass.ServerConfigFileName);
    XMLM.Free;
    iRow:=0;
    ndDef:=XMLDoc.DocumentElement;
    ndDef:=ndDef.FindNode('defenses');
    ndDef:=ndDef.FirstChild;
    while Assigned(ndDef) do begin //цикл по защитам
      // защиты //
      if UTF8LowerCase(ndDef.NodeName)='defense' then begin
        inc(iRow);
        tbKUDefense.RowCount:=iRow+1;
        tbKUDefense.Cells[0,iRow]:=GetAttribut(ndDef,'id','0');
        tbKUDefense.Cells[1,iRow]:=GetAttribut(ndDef,'name','0');
      end;
      ndDef:=ndDef.NextSibling;

    end;
    ndDef:=nil;
    XMLDoc.Free;
    XMLDoc:=nil;
  end;
  tbKUDefense.EndUpdate(TRUE);


То есть из файла считывает нормально, а так ошибку выдает:
[img]
In 'stream:' (line 1 pos 1): Root element is missing
[/img]
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

Обратите там внимание на кодировку:

:arrow: http://wiki.freepascal.org/XML_Tutorial/ru

Код: Выделить всё

Var
  S : TStringStream;
  XML : TXMLDocument;
 
begin
  S:= TStringStream.Create(MyXMLString);
  Try
    S.Position:=0;
    XML:=Nil;
    ReadXMLFile(XML,S); // XML документ целиком
    // Альтернативно:
    ReadXMLFragment(AParentNode,S); // Читаем только XML фрагмент.
  Finally
    S.Free;
  end;
end;
Аватара пользователя
*Rik*
постоялец
Сообщения: 453
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал
Контактная информация:

Сообщение *Rik* »

Попробуйте перед ReadXMLFile поставить:
XMLM.Seek(0, soFromBeginning);
son
новенький
Сообщения: 39
Зарегистрирован: 22.11.2011 11:50:58

Сообщение son »

*Rik* писал(а):Попробуйте перед ReadXMLFile поставить:
XMLM.Seek(0, soFromBeginning);


Спасибо! Действительно помогло!
Ответить