Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

XML Парсер [D7, XP]


Гость ©   (2009-07-03 13:34:00) 

Здравствуйте. Дорабатываю один проект, по распарсиванию XMl файлов, в проекте используется самодельный парсер. Суть в чем, при получении каких то данных из файла, сейчас начали поступать жалобы от клиентов , в том что в текстах содержатся какие то левые символы. Например Наименование "Товарищество с Ограниченной Ответственностью КарТел & ИнТерц".
Когда смотрю XML через броузер. он покажет как "КарТел & ИнТерц"
В сорсах файла & Я так понял это какие то  коды. Как мне теперь с этим бороться, первое, что пришло в голову это использовать StringReplace такие коды на нормальный текст. Если так правильно. то где взять весь перечень таких кодов, что бы избежать проблем в будущем. Посоветуйте новичку.


TIF   (2009-07-04 02:15:00) [1]

KilkennyCat ©   (03.07.09 23:08) [5]
> Не всегда. Хотя, вроде уже спорили на эту тему...

Кстати да. В "Прочем" стоит поискать тему, совсем недавно обсуждение было


DVM   (2009-07-03 23:19:00) [2]


> Гость


function CleanInvalidChars(const Str: WideString): WideString;
var
 I: Integer;
begin
 Result := '';

 for I := 1 to Length(Str) do
 begin
   if Str[I] = '&' then
     Result := Result + '&'
   else
   if Str[I] = '''' then
     Result := Result + '''
   else
   if Str[I] = '' then
     Result := Result + '>'
   else
   if Str[I] = '"' then
     Result := Result + '"'
   else
   if Word(Str[I]) > 255 then
     Result := Result + '&#' + IntToStr(Word(Str[I])) + ';'
   else
     Result := Result + Str[I];
 end;
end;

function CleanXMLChars(const Str: WideString): WideString;
var
 S: WideString;
 I, CharAsNum: LongInt;
begin
 Result := '';

 I := 0;
 while I < Length(Str) do
 begin
   Inc(I);

   if Str[I] = '&' then
   begin
     S := '&';
     while I < Length(Str) do
     begin
       Inc(I);

       S := S + Str[I];
       if Str[I] = ';' then
         Break;
     end;

     if S = '&' then
       Result := Result + '&'
     else
     if S = ''' then
       Result := Result + ''''
     else
     if S = '' then
       Result := Result + '>'
     else
     if S = '"' then
       Result := Result + '"'
     else
     if (Length(S) > 3) and (S[2] = '#') then
     begin
       CharAsNum := StrToIntDef(Copy(S, 3, Length(S) - 3) , -1);

       if CharAsNum = -1 then
         Result := Result + S
       else
         Result := Result + WideChar(CharAsNum);
     end else
       Result := Result + S;
   end else
     Result := Result + Str[I];

 end;
end;


KilkennyCat   (2009-07-03 23:08:00) [3]


> лучше не парить мозги, а использовать готовые парсеры. тот
> же msxml например.


Не всегда. Хотя, вроде уже спорили на эту тему... Лично я свой использую Узкая задача = узкий парсер, если проблемы - то только мои, а скорость выше.


Гость   (2009-07-03 14:05:00) [4]


> http://www.ascii.cl/htmlcodes.htm


То, что надо. Спасибо.


Palladin   (2009-07-03 13:53:00) [5]

http://www.ascii.cl/htmlcodes.htm


Гость   (2009-07-03 13:49:00) [6]

Да, просто времени нет на переписку, объемы большие, сроки реально горят. Подскажите что делать, а так бы сам TXMLDocument использовал бы.


Palladin   (2009-07-03 13:38:00) [7]

лучше не парить мозги, а использовать готовые парсеры. тот же msxml например.


Наверх

Титульная страница Поиск, карта сайта Написать письмо