Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Parsing XML файла.


Автор: iddqd 27.6.2006, 11:05
Есть xml файл. В нём находится необходимая информация о пользоватиле + фотография + подпись. необходимо получить все поля из файла.
Пробывал несколько парсеров, но неодин не читает файл. Показывает только "юя" в начале файла. Если из файла это удалить, то он становится вобще не читабельным.
Как мне поступить в данном случае? 

Забыл добавить сам файл.
Вот ссылки, т.к. на форум залить не получается.
http://slil.ru/22876587
http://rapidshare.de/files/24247717/Smirnova.rar.html 

Автор: comtat 27.6.2006, 12:13
А какими парсерами пользовался например ??
Пробовал ли XML Parser, XMLDocument - очень неплохая вещь ?? 

Автор: iddqd 27.6.2006, 12:21
1) стандартный Дельфийско-Микрософтовский парсер (TXmlDocument)
2) ECXML  
3) Native XML (http://www.simdesign.nl/xml.html)
4) MVRB XML, XML Documents Parser (© 2002 Равиль Батыршин.) с Torry (http://www.torry.net/vcl/internet/html/mvrbxmlparsers.zip)
5) Jan XML Parser2 (http://www.torry.net/vcl/internet/html/janxmlparser2.zip)

Читал другие топики на форуме. Ссылкпи взяты оттуда. 

Автор: drkot 27.6.2006, 12:45
Файл xml сохренен в формате юникод половина проблем отсюда (далеко не все парсеры поддерживают юникод) 
 

Автор: iddqd 27.6.2006, 13:04
Да, это я понял.
Можешь посоветовать какой-нибудь, который поддерживает его? 

Автор: drkot 27.6.2006, 13:50
Попробовал обработать твой файлик стандартным парсером (XMLDocument) проблем никаких не возникло. Все работает на ура.

ЗЫЖ МИД это прикольно. 

подтверждение моих слов во вложении 

Автор: iddqd 27.6.2006, 14:20
Можно твою тестовую программу заполучить? 

Автор: drkot 27.6.2006, 15:00
Модуль обработки сгенерирован XML Builder (встроен в делфю) 

Автор: iddqd 27.6.2006, 15:08
Я имею в виду сам код, как ты пользовался TXMLDocument.

Добавлено @ 15:12 
Ты автоматически сгенерировал код из дельфи для этого файла.
1. Как получить допустим поле картинки?
2. Будет ли оно точно также работать для другого файла xml с такой же структурой, но другими данными?

PS: Я знаю. один топик, один вопрос. Но переносить вопросы, относящиеся к этому топику в другой не имеет смысла.

 

Автор: drkot 27.6.2006, 15:15
примерно так
Код

var
  i:integer;
  str: string;
  pc1,pc2: array of char;
  fs: TFileStream;
begin
  XMLDocument:=TXMLDocument.Create('smirnova.xml');
  XMLProduction:=GetProductionQuery(XMLDocument);
  XMLQuery:=XMLProduction.Query;
  XMLPassport:=XMLQuery.Passport;
  XMLPrintable:=XMLPassport.Printable;
  str:=XMLPrintable.Surname.Russian;
  i:=XMLPrintable.PassportNumber;
  str:=XMLPrintable.HolderPortrait;
  i:=length(str)div 2;
  setlength(pc2, i);
  HexToBin(PChar(str), PChar(pc2), i);
  fs:= TFileStream.Create('1234.bmp', fmCreate);
  fs.WriteBuffer(pc2[0], i);
  fs.Free;
  Memo1.Lines.Add(inttostr(i));
end;
 

Автор: iddqd 27.6.2006, 15:26
Код

  XMLProduction:=GetProductionQuery(XMLDocument);
  XMLQuery:=XMLProduction.Query;
  XMLPassport:=XMLQuery.Passport;
  XMLPrintable:=XMLPassport.Printable;


Что это за переменные? 

Автор: iddqd 27.6.2006, 16:04
Разобрался самостоятельно, спасибо smile

Добавлено @ 16:05 
+1 

Автор: iddqd 8.9.2006, 14:34
Поднимаю снова этот вопрос.
Не вижу смысла создавать отдельную тему.
Сейчас у меня в xml файле с точно такой же структурой не одна запись, а 2 и более.
Вот xml файл: 
http://rapidshare.de/files/32366241/test.rar.html
или
http://getfile.biz/47722
Я сгенерировал для него код, с поощью XMLBuilder дельфийского.
И обращаюсь к полям так:
Код

procedure TForm8.Button1Click(Sender: TObject);
var
  i: integer;
  str: string;
  pc2: array of char;
  fs: TFileStream;
  st: TMemoryStream;
  Bmp: TBitmap;
  XMLPrintable: IXMLPrintableType;
  XMLProduction: IXMLProductionQueryType;
  XMLQuery: IXMLQueryType;
  XMlPassport: IXMLPassportType;
begin
  XMLDocument:= TXMLDocument.Create('test.xml');
  XMLProduction:= GetProductionQuery(XMLDocument);
  XMLQuery:= XMLProduction.Query;
  XMLPassport:= XMLQuery.Passport[1]; //здесь изменяется индекс для обращения к нужной записи
  XMLPrintable:= XMLPassport.Printable;
  //Caption:= XMLPrintable.Surname.Russian;
  Str:= XMLPrintable.HolderPortrait;
  i:= Length(Str) div 2;
  SetLength(pc2, i);
  HexToBin(PChar(Str), PChar(pc2), i);
  fs:= TFileStream.Create('portrait.bmp', fmCreate);
  fs.WriteBuffer(pc2[0], i);
  fs.Free;
  Str:= XMLPrintable.HolderSignature;
  i:= Length(Str) div 2;
  SetLength(pc2, i);
  HexToBin(PChar(Str), PChar(pc2), i);
  fs:= TFileStream.Create('sign.bmp', fmCreate);
  fs.WriteBuffer(pc2[0], i);
  fs.Free;
end;


При изменении индекса, который указан в коде все данные получаются нормально, кроме фотографии и подписи. Эти файлы пустые smile
Нормально получаются фото и подпись только для первой записи, с индексом 0.
Почему с остальными проблема?

Автор: drkot 11.9.2006, 11:06
Скорее всего неправильно сгенерирован интерфейсный модуль.
Смотри внимательно на параметры генерации.

Автор: iddqd 11.9.2006, 19:26
Ммм, где мне на них смотреть?
По-моему там только путь к файлу выбрать можно.
У тебя у самого всё работает и фотку нормально показывает?

Автор: drkot 12.9.2006, 09:08
Ошибка в 23 строке (это не шутка).
Проблемы связаны с кодировкой (utf8) я рекомендую использовать 1251.
В прочитаной строке (закодированая графика) вначале находятся символы перевода строки что и приводит к збою в преобразовании hextobin. Появление непечатных символов вызвано структурой исходного файла (парсер генератор и делфяшный видать не совместимы) .
Выход: проверять на наличие ошибочных символов.
Это хорошо видно в дебагере и исходном xml.

Цитата(iddqd @  11.9.2006,  19:26 Найти цитируемый пост)
Ммм, где мне на них смотреть?

после того как, визард составил структуру файла можно менять названия, типы и методы доступа для всех элементов

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)