powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
25 сообщений из 35, страница 1 из 2
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725215
menja_zovut_deniska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет.
Ситуация следующая: необходимо парсить приходящие xlm-файлы.
Приходят они в UTF-8, грузятся в CLOB и в 99+% случаев все ок.
Но встречаются такие, которые отказывются парситься с ошибкой LPX-00217 invalid character.

Я прочитал, что для нормальной работы с XML кодировка БД должна быть в соответствующем формате, но может быть есть возможность обойти экто ограничение?
Интересно, что если в редакторе PL/Sql Developer-а открыть содержимое CLOB-ячейки
а)вставить-убрать символ и сохранить
б)скопировать текст и вставить в новую ячейку
текст начинает парситься

Основные коды символов, которые пока попадались
Chr(8242) - 2
Chr(16662) - ''
Chr(4374) - ''
И если первый ищется инстром и, в принципе, меняется, то другие два символа данная ф-ция не видит.
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725222
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
menja_zovut_deniska,

А зачем искать?
Код: plsql
1.
2.
  select 'A'||Chr(16662)||'B', replace('A'||Chr(16662)||'B',Chr(16662),'') repl
    from  dual
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725227
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
menja_zovut_deniskaПриходят они в UTF-8, грузятся в CLOB и в 99+% случаев все ок.
Но встречаются такие, которые отказывются парситься с ошибкой LPX-00217 invalid character.
...
Основные коды символов, которые пока попадались
Chr(8242) - 2
Chr(16662) - ''
Chr(4374) - ''


Что-то тут не так.
Если БД действительно в cl8mswin1251, то при корректном сохранении UTF-8 в CLOB текст будет конвертирован в 1251, при этом символы, не представимые в 1251, будут автомагически заменены знаками вопроса.

Поэтому проблема бьется на отдельные части:
1. Корректное сохранение данных в CLOB.
2. Корректная работа с xml.

По первому пункту - сессионный characterset должен быть указан как al32utf8 для загрузки utf8-файлов.
Если важно сохранять оригинальный xml - то, как вариант, воспользуйтесь NClob.
Обратите внимание: charset, указанный в заголовке xml-документа, не будет соответствовать кодировке файла в БД.
Если хочется хранить именно оригинал xml-документа, то рассмотрите BLOB.
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725461
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousЕсли БД действительно в cl8mswin1251, то при корректном сохранении UTF-8 в CLOB текст будет конвертирован в 1251, при этом символы, не представимые в 1251, будут автомагически заменены знаками вопроса.В 11.2.0.2 (или 0.3) был заменён парсер xml. Неконвертируемые символы стали приводить, насколько я помню, именно к этой ошибке.
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725648
menja_zovut_deniska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaximaXXL,

И реплейсил и транслейтил по кодам - ошибка та же самая
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725655
Куй железо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
menja_zovut_deniska,

поменяй CLOB на BLOB
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725657
menja_zovut_deniska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot andrey_anonymous]menja_zovut_deniskaПо первому пункту - сессионный characterset должен быть указан как al32utf8 для загрузки utf8-файлов.

Поставил эксперимент у себя локально
БД 11.2.0.4

2 инстанса
-win1251
-al32utf8

Гружу со своей машины следующим скриптом

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
declare 
    Dest_Clob  CLOB;
    Src_Clob   BFILE;
    Dst_Offset NUMBER;
    Src_Offset NUMBER;
    Lang_Ctx   NUMBER := Dbms_Lob.Default_Lang_Ctx;
    p_Warning  NUMBER;
  
    Len          NUMBER;
    l_Buffersize NUMBER := 3556437; 
    Amount       NUMBER;
  
  BEGIN
        delete clob_test;
        commit;
        Src_Clob := Bfilename('C_TEMP','TEST.xml');
        Dbms_Lob.Open(Src_Clob, Dbms_Lob.Lob_Readonly);
        Len := Dbms_Lob.Getlength(Src_Clob);      
        Dbms_Lob.Createtemporary(Dest_Clob, FALSE);
        Dst_Offset := 1;
        Src_Offset := 1;
          LOOP
            IF (Src_Offset + l_Buffersize - 1 > Len) THEN
              Amount := Len - Src_Offset + 1;
            ELSE
              Amount := l_Buffersize;
            END IF;
          
            Dbms_Lob.Loadclobfromfile(Dest_Lob     => Dest_Clob,
                                      Src_Bfile    => Src_Clob,
                                      Amount       => Amount,
                                      Dest_Offset  => Dst_Offset,
                                      Src_Offset   => Src_Offset,
                                      Bfile_Csid   => 873,
                                      Lang_Context => Lang_Ctx,
                                      Warning      => p_Warning);
          
            EXIT WHEN Src_Offset > Len;
          
          END LOOP;
          insert into clob_test(id,
                                i)
                                values(Dest_Clob,1);
          commit;
end;



Запрос следующий

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select d.*
 from 
  CLOB_TEST a,
   Xmltable('//Файл/Документ' Passing Xmlparse(Document a.id) 
                Columns 
                IDDoc VARCHAR2(1000) Path '@ИдДок'
               )d
    WHERE       a.i=1;



В случае al32utf8 запрос отрабатывается как надо
В случае 1251(в реестре специально поменял все nls_lang на american_america.al32utf8) ошибка
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725664
menja_zovut_deniska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Куй железоmenja_zovut_deniska,

поменяй CLOB на BLOB
Ничего не изменилось в плане ошибки
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725671
Куй железо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
menja_zovut_deniskaКуй железоmenja_zovut_deniska,

поменяй CLOB на BLOB
Ничего не изменилось в плане ошибки

а ты в коде соотв. инструменты связанные с типом CLOB не поменял наверно ?

Dbms_Lob.Load clob fromfile
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725674
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
menja_zovut_deniskaОсновные коды символов, которые пока попадались
Chr(8242) - 2
Chr(16662) - ''
Chr(4374) - ''При кодировке базы 1251 символы имеют код в диапазоне 0-255. Более того, приведенные числа не имеют никакого отношения и к символам UTF-8, так как двубайт должен начинаться с битов 10.
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725681
menja_zovut_deniska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Куй железо,
конечно поменял))
Та бы скрипт не отпработал. Таблица-то другая
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725689
menja_zovut_deniska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-menja_zovut_deniskaОсновные коды символов, которые пока попадались
Chr(8242) - 2
Chr(16662) - ''
Chr(4374) - ''При кодировке базы 1251 символы имеют код в диапазоне 0-255. Более того, приведенные числа не имеют никакого отношения и к символам UTF-8, так как двубайт должен начинаться с битов 10.
Ок. Внешние xml-парсеры нормально разбирают файл, Oracle с кодировкой инстанса al32utf8 тоже.
Вопрос в том, как и можно ли распарсить его в инстансе с кодировкой 1251
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725699
Куй железо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
menja_zovut_deniska-2-пропущено...
При кодировке базы 1251 символы имеют код в диапазоне 0-255. Более того, приведенные числа не имеют никакого отношения и к символам UTF-8, так как двубайт должен начинаться с битов 10.
Ок. Внешние xml-парсеры нормально разбирают файл, Oracle с кодировкой инстанса al32utf8 тоже.
Вопрос в том, как и можно ли распарсить его в инстансе с кодировкой 1251

наверно в этом у тебя проблема можно ли распарсить его в инстансе с кодировкой 1251

Lang_Ctx NUMBER := Dbms_Lob.Default_Lang_Ctx;
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725712
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
menja_zovut_deniskaВопрос в том, как и можно ли распарсить его в инстансе с кодировкой 1251Можно. Но для этого нужно определить причину ошибки.

Код: plsql
1.
declare ...

Зачем тут цикл. Да и вообще зачем столько кода, делай сразу селект из файла.
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725727
menja_zovut_deniska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-menja_zovut_deniskaВопрос в том, как и можно ли распарсить его в инстансе с кодировкой 1251Можно. Но для этого нужно определить причину ошибки.

Код: plsql
1.
declare ...

Зачем тут цикл. Да и вообще зачем столько кода, делай сразу селект из файла.
Делал. Ситуация не менялась.
Еще руками ctrl-c ctrl-v из файла в clob поле делал))
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725773
kaldorey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
menja_zovut_deniska,
У мня была похожая проблема, ошибка возникала в момент сохранения в таблицу. Проблема скорее всего была не в определенном символе, а в последовательности, путем добавления лишних незначащих символов часто удавалось решить, но не всегда. До конца так и не разобрался
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725775
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можете сделать короткий wellformed- образец xml-файла, демонстрирующий проблему?
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725793
menja_zovut_deniska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я могу на почту или в личку кинуть сам заархивированный xml
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725898
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
menja_zovut_deniska,

Просто сделайте минимальный пример и приложите к сообщению на форум.
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725916
menja_zovut_deniska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymousmenja_zovut_deniska,

Просто сделайте минимальный пример и приложите к сообщению на форум.
Как я могу сделать минимальный пример, если не я формирую данные файлы и не знаю местарасположения данных символов в файле?
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725925
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
menja_zovut_deniskaandrey_anonymousmenja_zovut_deniska,
Просто сделайте минимальный пример и приложите к сообщению на форум.
Как я могу сделать минимальный пример, если не я формирую данные файлы и не знаю местарасположения данных символов в файле?
Ну уж постарайтесь как-нибудь.
Что-то мне подсказывает, что проблемные символы будут находиться в районе смещения 3556437
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725957
menja_zovut_deniska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymousmenja_zovut_deniskaпропущено...

Как я могу сделать минимальный пример, если не я формирую данные файлы и не знаю местарасположения данных символов в файле?
Ну уж постарайтесь как-нибудь.
Что-то мне подсказывает, что проблемные символы будут находиться в районе смещения 3556437

Лучше приложу более компактный код и скажу, что ровно ничего не поменялось

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
declare 
    Dest_Clob  CLOB;
    Src_Clob   BFILE;
    Dst_Offset NUMBER:=1;
    Src_Offset NUMBER:=1;
    Lang_Ctx   NUMBER := Dbms_Lob.Default_Lang_Ctx;
    p_Warning  NUMBER;  
  
  BEGIN
        delete clob_test;
        commit;
        Src_Clob := Bfilename('C_TEMP','TEST.xml');
        Dbms_Lob.Open(Src_Clob, Dbms_Lob.Lob_Readonly);
        Dbms_Lob.Createtemporary(Dest_Clob, FALSE);
        Dbms_Lob.Loadclobfromfile(Dest_Lob     => Dest_Clob,
                                      Src_Bfile    => Src_Clob,
                                      Amount       => Dbms_Lob.Getlength(Src_Clob),
                                      Dest_Offset  => Dst_Offset,
                                      Src_Offset   => Src_Offset,
                                      Bfile_Csid   => 873,
                                      Lang_Context => Lang_Ctx,
                                      Warning      => p_Warning);
          
      DBMS_LOB.CLOSE(Src_Clob);
      insert into clob_test(id,
                                i)
                                values(Dest_Clob,1);
          commit;
end;
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39726034
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
menja_zovut_deniskaЛучше приложу более компактный код и скажу, что ровно ничего не поменялось


Да не особо лучше.
Выстрел вслепую:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
declare 
    Dest_Clob  CLOB;
    Dst_Offset NUMBER:=1;
    Src_Offset NUMBER:=1;
    Lang_Ctx   NUMBER := Dbms_Lob.Default_Lang_Ctx;
    p_Warning  NUMBER;  
BEGIN
        delete clob_test;
        commit;
      insert into clob_test(id,i)
                  values(Dest_Clob,1)
           returning id into Dest_Clob
            ;
        Dbms_Lob.Loadclobfromfile(Dest_Lob     => Dest_Clob,
                                      Src_Bfile    => Bfilename('C_TEMP','TEST.xml'),
                                      Amount       => DBMS_LOB.LOBMAXSIZE,
                                      Dest_Offset  => Dst_Offset,
                                      Src_Offset   => Src_Offset,
/* Попробуйте выбрать одну из строк ниже */
--                                      Bfile_Csid   =>  nls_charset_id('AL32UTF8'),
                                      Bfile_Csid   =>  nls_charset_id('UTF8'),
                                      Lang_Context => Lang_Ctx,
                                      Warning      => p_Warning);
  if p_Warning = DBMS_LOB.WARN_INCONVERTIBLE_CHAR then
    dbms_output.put_line('DBMS_LOB.WARN_INCONVERTIBLE_CHAR');
  end if;
  commit;
end;
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39726046
menja_zovut_deniska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymousmenja_zovut_deniskaЛучше приложу более компактный код и скажу, что ровно ничего не поменялось


Да не особо лучше.
Выстрел вслепую:
[/src]

Ну если не особо лучше, подскажите как я могу "сделать короткий wellformed- образец xml-файла, демонстрирующий проблему"
Я с удовольствием...

Выстрел не попал: ora-06502 numeric or value error invalid LOB locator
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39726053
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
menja_zovut_deniskaкак я могу "сделать короткий wellformed- образец xml-файла, демонстрирующий проблему"Возьми исходный xml и отсеки все лишнее.

menja_zovut_deniskaВыстрел не попал: ora-06502 numeric or value error invalid LOB locatorinsert empty_clob().
...
Рейтинг: 0 / 0
25 сообщений из 35, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]