![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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 например.