:: Не фоксом единым
Проблема перекодировки значений атрибутов XML (UTF-8 <--> 1251)
tata

Сообщений: 3459
Откуда: Казань
Дата регистрации: 23.10.2005
Имеем: БД на Postgresql c кодировкой UTF-8.
Данные выводим в XML (Центробанк требует в кодировке 1251).
результат:
<?xml version="1.0" encoding="windows-1251""?>
<Ф0409118 xmlns="urn:cbr-ru:rep0409118:v3.0.4.5" УникИдОЭС="a15fde9e-b51b-4e29-b567-f4567f246420" ВидОЭС="" КодФормы="118" ОКУД="409118" ВидОтчета="" ОтчДата="2019-03-01" Периодичность="" ДатаВремяФормирования="2023-03-20T13:14:36.406029+03:00"><Составитель ВидОрг="&#x412;&#x438;&#x434;&#x41E;&#x440;&#x433;" КодОрг="&#x41A;&#x43E;&#x434;&#x41E;&#x440;&#x433;&#x422;&#x438;&#x43F;" КодТУ="&#x41A;&#x43E;&#x434;&#x422;&#x423;" БИК="&#x411;&#x418;&#x41A;" ОКАТО="&#x41E;&#x41A;&#x410;&#x422;&#x41E;" ОКПО="&#x41E;&#x41A;&#x41F;&#x41E;" ОГРН="&#x41E;&#x413;&#x420;&#x41D;" СокрНаимен="&#x421;&#x43E;&#x43A;&#x440;&#x41D;&#x430;&#x438;&#x43C;&#x435;&#x43D;" Адрес="&#x410;&#x434;&#x440;&#x435;&#x441;" ДатаПодписания="&#x414;&#x430;&#x442;&#x430;&#x41F;&#x43E;&#x434;&#x43F;&#x438;&#x441;&#x430;&#x43D;&#x438;&#x44F;"><Руководитель Должность="&#x420;&#x443;&#x43A;&#x414;&#x43E;&#x43B;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x44C;" ФИО="&#x420;&#x443;&#x43A;&#x424;&#x418;&#x41E;"/><ГлавБух Должность="&#x411;&#x443;&#x445;&#x414;&#x43E;&#x43B;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x44C;" ФИО="&#x411;&#x443;&#x445;&#x424;&#x418;&#x41E;"/><Исполнитель ИсполнительДолжность="&#x418;&#x

Есть ли какие-то рекомендации по правильному выводу русских символов в значениях атрибутов XML?
Может, кто-то это уже проходил?
Ratings: 0 negative/0 positive
Re: Проблема перекодировки значений атрибутов XML (UTF-8 <--> 1251)
sphinx

Сообщений: 31179
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Как выводите?


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Проблема перекодировки значений атрибутов XML (UTF-8 <--> 1251)
tata

Сообщений: 3459
Откуда: Казань
Дата регистрации: 23.10.2005
Разработка Сергея Сизова.
drop table if exists tmp_r;
select r.*, gen_random_uuid() as v_guid, 'квартальная' as vidOES, cast('20190301' as date) as v_rep_period,
'quarter' as period
into tmp_r from dh._report r where code = '118';
select xmlroot('', version '1.0" encoding="windows-1251"') as xmltext
union all
select
xmlelement (name Ф0409118, XMLATTRIBUTES (
delta_xmlns AS xmlns,
r.v_guid AS "УникИдОЭС",
r.vidOES AS "ВидОЭС",
r.code AS "КодФормы",
r.okud AS "ОКУД",
'квартальный' AS "ВидОтчета",
r.v_rep_period AS "ОтчДата",
r.period AS "Периодичность",
now() AS "ДатаВремяФормирования"
),
xmlelement(name Составитель, XMLATTRIBUTES (
'ВидОрг' as "ВидОрг",
'КодОргТип' as "КодОрг",
'КодТУ' as "КодТУ",
'БИК' as "БИК",
'ОКАТО' as "ОКАТО",
'ОКПО' as "ОКПО",
'ОГРН' as "ОГРН",
'СокрНаимен' as "СокрНаимен",
'Адрес' as "Адрес",
'ДатаПодписания' as "ДатаПодписания"),
XMLELEMENT(name Руководитель, XMLATTRIBUTES('РукДолжность' as "Должность", 'РукФИО' as "ФИО")),
xmlelement(name ГлавБух, XMLATTRIBUTES('БухДолжность' as "Должность", 'БухФИО' as "ФИО")),
xmlelement(name Исполнитель, XMLATTRIBUTES('ИспДолжность' as "ИсполнительДолжность", 'ИспФИО' as "ФИО",
'Телефон' as "Телефон", 'Факс' as "Факс", 'ЭлПочта' as "ЭлПочта"))
),
xmlelement(name Данные118, XMLATTRIBUTES('1' as "Ид")), --, query_to_xml(<запрос>)),
xmlelement(name НетДанных, XMLATTRIBUTES('1' as "КодНепредставления")),
xmlelement(name Пояснение, '', 'СтрокаПояснения')
)
from tmp_r r



Исправлено 1 раз(а). Последнее : tata, 20.03.23 15:24
Ratings: 0 negative/0 positive
Re: Проблема перекодировки значений атрибутов XML (UTF-8 <--> 1251)
ssa
Автор

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
Вот исправленный вариант:
drop table if exists dh.tmp_r;
select r.*, gen_random_uuid() as v_guid, 'Вид ОЭС' as v_vidOES, cast('20190301' as date) as v_rep_period,
'ежемесячно' as v_period, 'ssa-asus' as pk_name, '2.0.2' as N_meta, cast('20200101' as date) as d_meta,
'1.0.1' as n_pk, cast('20190101' as date) as d_pk
into dh.tmp_r from dh._report r where code = '118';
select concat('<?xml version="1.0" encoding="windows-1251"?>'::text, _xml_translated::text) as text_xml
from (
select
xmlelement (name Ф0409118, XMLATTRIBUTES (
delta_xmlns AS xmlns,
r.v_guid AS "УникИдОЭС",
r.v_vidOES AS "ВидОЭС",
r.code AS "КодФормы",
r.okud AS "ОКУД",
'Вид отчета' AS "ВидОтчета",
r.v_rep_period AS "ОтчДата",
r.v_period AS "Периодичность",
now() AS "ДатаВремяФормирования"
),
xmlelement(name Составитель, XMLATTRIBUTES (
'ВидОрг' as "ВидОрг",
'КодОргТип' as "КодОрг",
'КодТУ' as "КодТУ",
'БИК' as "БИК",
'ОКАТО' as "ОКАТО",
'ОКПО' as "ОКПО",
'ОГРН' as "ОГРН",
'СокрНаимен' as "СокрНаимен",
'Адрес' as "Адрес",
'ДатаПодписания' as "ДатаПодписания"),
XMLELEMENT(name Руководитель, XMLATTRIBUTES('РукДолжность' as "Должность", 'РукФИО' as "ФИО")),
xmlelement(name ГлавБух, XMLATTRIBUTES('БухДолжность' as "Должность", 'БухФИО' as "ФИО")),
xmlelement(name Исполнитель, XMLATTRIBUTES('ИспДолжность' as "ИсполнительДолжность", 'ИспФИО' as "ФИО",
'Телефон' as "Телефон", 'Факс' as "Факс", 'ЭлПочта' as "ЭлПочта"))
),
xmlelement(name Данные118, XMLATTRIBUTES('1' as "Ид")), --, query_to_xml(<запрос>)),
xmlelement(name НетДанных, XMLATTRIBUTES('1' as "КодНепредставления")),
xmlelement(name Пояснение, '', 'СтрокаПояснения'),
xmlelement(name ПротоколКонтроля, '', xmlelement(name Сообщение, '', 'СтрокаСообщения')),
xmlelement(name ИнфПК, XMLATTRIBUTES (
r.pk_name as "ИмяПК",
r.n_meta as "НомерВерсииМета",
r.d_meta as "ДатаВерсииМета",
r.n_pk as "НомерВерсииПК",
r.d_pk as "ДатаВерсииПК"
)
)
)
from dh.tmp_r r
) x1(_xml)
cross join xmlparse(content unistr(regexp_replace(x1._xml::text, '\&\#[xX](4[0-5][0-9a-fA-F])\;', '\\0\1', 'g'))) x2(_xml_translated);
Перекодировка идет за счет последней строки.
Берите как образец создания отчетов в XML на Postgres. Вывод табичных данных тут замаскирован в
query_to_xml(<запрос>)


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 5 (Гостей: 5)

© 2000-2024 Fox Club 
Яндекс.Метрика