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

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

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

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

Сообщение son » 27.12.2016 14:15:05

Доброго всем. Небольшой вопрос. Есть 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]
son
новенький
 
Сообщения: 39
Зарегистрирован: 22.11.2011 11:50:58

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

Сообщение vitaly_l » 27.12.2016 14:40:10

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

: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;
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение *Rik* » 27.12.2016 20:45:41

Попробуйте перед ReadXMLFile поставить:
XMLM.Seek(0, soFromBeginning);
Аватара пользователя
*Rik*
постоялец
 
Сообщения: 427
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал

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

Сообщение son » 28.12.2016 12:47:16

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


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


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 85

Рейтинг@Mail.ru