ReadXMLFile и поток

Вопросы программирования на Free Pascal, использования компилятора и утилит.

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

Ответить
BORNDEAD
незнакомец
Сообщения: 2
Зарегистрирован: 06.02.2009 16:15:02

ReadXMLFile и поток

Сообщение BORNDEAD »

Судя по документации работает только с файлами и потоками.
Попробовал с потоком, при записи строки приписываются в начало 4 байта :!: неизвестно (по крайней мере мне) откуда
Есть ли другой способ считать из строки в xml документ?

З.Ы. lazarus 0.9.26, FPC 2.2.2, архитектура х64
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Посмотрите про реализацию функции Stream.WriteAnsiString и всё поймёте.
Первые 4 байта это размер строки!

Добавлено спустя 1 минуту 5 секунд:
Делайте запись посредством Strem.WriteBuffer
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Для чтения из строки нужно создать поверх нее TStringStream и потом из него читать:

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

Var
  S : TStringStream;
  XML : TXMLDocument;
 
begin
  S:= TStringStream.Create(MyXMLString);
  Try
    S.Position:=0;
    ReadXMLFile(XML,S); // Чтение документа целиком
    // или:
    ReadXMLFragment(AParentNode,S); // Чтение части документа
  Finally
    S.Free;
  end;
end;
AltRunner
незнакомец
Сообщения: 4
Зарегистрирован: 18.03.2009 17:25:53

Сообщение AltRunner »

Здравствуйте!
Пробовал преобразовать строку в XML документ как описано выше но Lazarus выдет ошибку:

unit1.pas(61,32) Error: Call by var for arg no. 2 has to match exactly: Got "TStringStream" expected "TStream"

Не компилируется нивкакую. Может надо какой модуль подключить?

модули:
uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
StdCtrls, WInInet, DOM, XMLRead;


Помогите пожалуйста.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Понимаете невозможно вам нечего подсказать пока не будет опублекован код где возникает ошибка.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Этот баг был исправлен 15 сентября прошлого года. Обновляйтесь...
AltRunner
незнакомец
Сообщения: 4
Зарегистрирован: 18.03.2009 17:25:53

Сообщение AltRunner »

Извините но откуда обновляться? на оффсайте выложена версия 2.2.2 от 11 августа 2008 года.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Sergei I. Gorelkin писал(а):Этот баг был исправлен 15 сентября прошлого года. Обновляйтесь...

...странно...
AltRunner писал(а):Извините но откуда обновляться? на оффсайте выложена версия 2.2.2 от 11 августа 2008 года.

у меня проблем с XML в данной версии небыло...
покажите участок кода где возникает данная ошибка.
AltRunner
незнакомец
Сообщения: 4
Зарегистрирован: 18.03.2009 17:25:53

Сообщение AltRunner »

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

procedure StringToXML(aXMLString:string;aXMLDocument:TXMLDocument);
var ss:TStringStream;
begin
ss:=TStringStream.Create(aXMLString);
  Try
    SS.Position:=0;
    aXMLDocument:=Nil;
    ReadXMLFile(aXMLDocument,ss);
  Finally
    SS.Free;
  end;
end;
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Баг заключался в наличии ненужного "var" в объявлении ReadXMLFile:

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

procedure ReadXMLFile(out ADoc: TXMLDocument; var f: TStream);

из-за чего она не принимала наследников TStream, в частности TStringStream.

Но в принципе в данном примере достаточно изменить тип переменной ss на TStream, и все должно работать даже без обновления.
AltRunner
незнакомец
Сообщения: 4
Зарегистрирован: 18.03.2009 17:25:53

Сообщение AltRunner »

Менять тип переменной пробовал - в результате Can not write to stream при попытке записать в него строку.
проблему решил установкой снапшота Lazarus 0.9.27 + FPC 2.2.5 Но попробую отредактировать юнит (использовать снапшот както страшно)
Ответить