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

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

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

А зачем искать?
Код: plsql
1.
2.
  select 'A'||Chr(16662)||'B', replace('A'||Chr(16662)||'B',Chr(16662),'') repl
    from  dual
...
Рейтинг: 0 / 0
30.10.2018, 19:20
    #39725227
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
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
31.10.2018, 08:05
    #39725461
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
andrey_anonymousЕсли БД действительно в cl8mswin1251, то при корректном сохранении UTF-8 в CLOB текст будет конвертирован в 1251, при этом символы, не представимые в 1251, будут автомагически заменены знаками вопроса.В 11.2.0.2 (или 0.3) был заменён парсер xml. Неконвертируемые символы стали приводить, насколько я помню, именно к этой ошибке.
...
Рейтинг: 0 / 0
31.10.2018, 11:36
    #39725648
menja_zovut_deniska
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
MaximaXXL,

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

поменяй CLOB на BLOB
...
Рейтинг: 0 / 0
31.10.2018, 11:42
    #39725657
menja_zovut_deniska
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
[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
31.10.2018, 11:48
    #39725664
menja_zovut_deniska
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
Куй железоmenja_zovut_deniska,

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

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

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

Dbms_Lob.Load clob fromfile
...
Рейтинг: 0 / 0
31.10.2018, 11:53
    #39725674
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
menja_zovut_deniskaОсновные коды символов, которые пока попадались
Chr(8242) - 2
Chr(16662) - ''
Chr(4374) - ''При кодировке базы 1251 символы имеют код в диапазоне 0-255. Более того, приведенные числа не имеют никакого отношения и к символам UTF-8, так как двубайт должен начинаться с битов 10.
...
Рейтинг: 0 / 0
31.10.2018, 11:58
    #39725681
menja_zovut_deniska
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
Куй железо,
конечно поменял))
Та бы скрипт не отпработал. Таблица-то другая
...
Рейтинг: 0 / 0
31.10.2018, 12:04
    #39725689
menja_zovut_deniska
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
-2-menja_zovut_deniskaОсновные коды символов, которые пока попадались
Chr(8242) - 2
Chr(16662) - ''
Chr(4374) - ''При кодировке базы 1251 символы имеют код в диапазоне 0-255. Более того, приведенные числа не имеют никакого отношения и к символам UTF-8, так как двубайт должен начинаться с битов 10.
Ок. Внешние xml-парсеры нормально разбирают файл, Oracle с кодировкой инстанса al32utf8 тоже.
Вопрос в том, как и можно ли распарсить его в инстансе с кодировкой 1251
...
Рейтинг: 0 / 0
31.10.2018, 12:09
    #39725699
Куй железо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
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
31.10.2018, 12:18
    #39725712
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
menja_zovut_deniskaВопрос в том, как и можно ли распарсить его в инстансе с кодировкой 1251Можно. Но для этого нужно определить причину ошибки.

Код: plsql
1.
declare ...

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

Код: plsql
1.
declare ...

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

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

Просто сделайте минимальный пример и приложите к сообщению на форум.
Как я могу сделать минимальный пример, если не я формирую данные файлы и не знаю местарасположения данных символов в файле?
...
Рейтинг: 0 / 0
31.10.2018, 15:42
    #39725925
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
menja_zovut_deniskaandrey_anonymousmenja_zovut_deniska,
Просто сделайте минимальный пример и приложите к сообщению на форум.
Как я могу сделать минимальный пример, если не я формирую данные файлы и не знаю местарасположения данных символов в файле?
Ну уж постарайтесь как-нибудь.
Что-то мне подсказывает, что проблемные символы будут находиться в районе смещения 3556437
...
Рейтинг: 0 / 0
31.10.2018, 16:07
    #39725957
menja_zovut_deniska
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
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
31.10.2018, 17:21
    #39726034
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
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
31.10.2018, 17:31
    #39726046
menja_zovut_deniska
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
andrey_anonymousmenja_zovut_deniskaЛучше приложу более компактный код и скажу, что ровно ничего не поменялось


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

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

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

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


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