CftClub.ru
Клуб специалистов ЦФТ-Банк

Простой разбор документов XML
На страницу Пред.  1, 2, 3  След.
 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Справочник PL/PLUS: Функции, примеры, приёмы
Предыдущая тема :: Следующая тема  
Автор Сообщение
dnk_dz
Эксперт


Вступление в Клуб: 19.09.2007
СообщениеВт Фев 14, 2012 10:03    Ответить с цитатой
Полезность: Нет оценки
Тут есть два момента. Первое, как было замечено, нативная поддержка на уровне PL+. Второе, быстродействие. При онлайн взаимодействии на первый план выходит скорость реакции системы, что, например, со встроенным парсером вряд-ли возможно. Посмотрите, например, форматы ЦФТ-интегратора - плоский одноуровневый xml.
Все вышесказанное - мое сугубо личное мнение, основанное на некотором опыте организации взаимодействия на базе xml как через файлы, так и онлайн.
Будем надеяться, что ЦФТ все-таки встроит в ИБСО нормальные средства работы с xml.
dumpino
Участник со стажем


Вступление в Клуб: 13.12.2011
СообщениеВт Фев 14, 2012 10:30    Ответить с цитатой
Полезность: Нет оценки
как я понял, с помощью XSD мы можем проверить не только правильность синтаксиса XML документа, но также его структуру, модель содержания и типы данных (отсюда).

конечно, это хорошо, если мы делаем сложное приложение на xml (например вэб сервис). но сейчас нам требуется сделать экспорт данных в примитивный XML, стоит ли заморачиватья насчет XSD?
maestro
Профи


Вступление в Клуб: 12.10.2010
СообщениеВт Фев 14, 2012 10:40    Ответить с цитатой
Полезность: Нет оценки
dnk_dz пишет:
Тут есть два момента. Первое, как было замечено, нативная поддержка на уровне PL+. Второе, быстродействие. При онлайн взаимодействии на первый план выходит скорость реакции системы, что, например, со встроенным парсером вряд-ли возможно.


Как раз таки наоборот: оракловый парсер написан на С, поэтому скорость его работы высокая. ЦФТшные парсеры написаны на PL+ (PL/SQL), XML_DOM вроде на Яве написан (но могу ошибаться).

Если требуется загрузка объемной плоской портянки, то следует отказаться от использование DOM-модели, т.к. она будет поедать PGA, и использовать SAX-парсер DBMS_XMLSTORE.

Если говорить основываясь на опыте, то я как-то делал шлюз с OpenWay, и там грузилась избыточная и довольно ветвистая XMLка. Надо было использовать XSLT для упрощения структуры, и это накладывало необходимость использования DOM.
30Мб файлы на ура пролетали!
maestro
Профи


Вступление в Клуб: 12.10.2010
СообщениеВт Фев 14, 2012 10:44    Ответить с цитатой
Полезность: Нет оценки
dumpino пишет:
но сейчас нам требуется сделать экспорт данных в примитивный XML, стоит ли заморачиватья насчет XSD?


Попробуй DBMS_XMLGEN.
Вот тебе примерчег:
Код:

   -- Собираем XML массива операций
   declare
      ctx             dbms_xmlgen.ctxHandle;
      cur            sys_refcursor;
                sOperXml   XMLType;      -- XML массива операций
   begin
      cur%open(
         select    arr(
                  .....
               )
         
         in        this.[CONTRACTS]
      );
      
      ctx := dbms_xmlgen.newContext(cur);   
   
      dbms_xmlgen.setRowTag(ctx, 'base_val_arr');
      dbms_xmlgen.setNullHandling(ctx, 2);      -- Заставляем выгружать пустые значения.
   
      sOperXml := dbms_xmlgen.getXMLType(ctx);
      dbms_xmlgen.closeContext(ctx);
      cur%close;
   end;
dumpino
Участник со стажем


Вступление в Клуб: 13.12.2011
СообщениеВт Фев 14, 2012 11:04    Ответить с цитатой
Полезность: Нет оценки
maestro пишет:

Попробуй DBMS_XMLGEN.


этот метод безусловно хорош, записал в свой блокнотик. но, наверно, мне стоило это сказать раньше, у меня чётко определены название полей в XML файле.

Код:
<?xml version="1.0" encoding="WINDOWS-1251" standalone="no" ?>
<Список_документов>
<Данные>
<ЛичныеДанные>пример личных данных</ЛичныеДанные>
</Данные>
</Список_документов>
... и таких штук 100


и пока ничего лучше как "через обычную строковую переменную" генерить xml файл не вижу.

возможно я гиперглуп? Smile
svn
Профи


Вступление в Клуб: 04.02.2008
СообщениеВт Фев 14, 2012 11:13    Ответить с цитатой
Полезность: Нет оценки
уже давно дистрибутивно можно работать через XMLDB
maestro
Профи


Вступление в Клуб: 12.10.2010
СообщениеВт Фев 14, 2012 11:20    Ответить с цитатой
Полезность: Нет оценки
svn пишет:
уже давно дистрибутивно можно работать через XMLDB


Вась, примерчик кинь plz.

Да и потом. Если говорить про XDB (XDK), то к пакетам dbms_xmldom, dbms_xslprocessor можно было и так обращаться. А вот конструкции XMLType, которые пишутся в селектах, PL+ спецификация, насколько я знаю, не поддерживает.


Последний раз редактировалось: maestro (Вт Фев 14, 2012 11:36), всего редактировалось 2 раз(а)
maestro
Профи


Вступление в Клуб: 12.10.2010
СообщениеВт Фев 14, 2012 11:23    Ответить с цитатой
Полезность: 1
dumpino пишет:

этот метод безусловно хорош, записал в свой блокнотик. но, наверно, мне стоило это сказать раньше, у меня чётко определены название полей в XML файле.


Имена полей выходного XML определеются алиасами курсора.
Вложенный элемент можно засунуть через UpdateXml:

Код:

--- DBMS_XMLGEN sample
declare
  sSQL        varchar2(32000);
  ctx             dbms_xmlgen.ctxHandle;
  acc_xml     XMLType;
  Xml  XMLType := XMLType(
    '<MESSAGE>
      <CLIENT_NAME>client_name</CLIENT_NAME>
      <CLIENT_BIC>client_bic</CLIENT_BIC>
      <ACCOUNTS>
        accounts
      </ACCOUNTS>
    </MESSAGE>'
   );
begin
  sSQL := 'select
        a.c_main_v_id   acc_num,
             cur.c_cur_short cur   
    from   ibs.z#ac_fin a, ibs.z#ft_money cur
    where
         cur.id(+) = a.c_fintool and
         rownum < 3';

  ctx := dbms_xmlgen.newContext(sSQL);
  dbms_xmlgen.setRowSetTag(ctx, 'ACCOUNTS');    -- Тэг корня XML-ки счетов
  dbms_xmlgen.setRowTag(ctx, 'ACCOUNT');

  acc_xml := dbms_xmlgen.getXMLType(ctx);
   dbms_xmlgen.closeContext(ctx);
 
  --
  --dbms_output.put_line(acc_xml.extract('*').getStringVal());
  select updateXml (
               xml
             , '/MESSAGE/CLIENT_NAME/text()'
             , 'Вася Пупкин'
             , '/MESSAGE/CLIENT_BIC/text()'
             , '123456789'
             , '/MESSAGE/ACCOUNTS'
             , acc_xml
           )
    into XML
    from DUAL;
   
    --
    dbms_output.put_line(Xml.extract('*').getStringVal());
end;


Если уж ничего кроме ваяния ручками прикрутить не получается, то можно вот так:
Код:

-- Сочинение XML c F1 XMLElement
create table srjtmp (f1 varchar2(255), f2 varchar2(255));
insert into srjtmp(f1,f2) values ('12', '22');
insert into srjtmp(f1,f2) values ('32', '32');

      SELECT 
            XMLElement( "root", 
                XMLElement("f1",  f1),
                XMLElement("f2",
                      (SELECT
                           XMLAGG(XMLELEMENT("f1f2",
                           e.f1||' '||e.f2)
                           ORDER BY f2)                         
                           FROM srjtmp e                           
                      )
                    )
            ) 
        FROM 
            srjtmp; 
svn
Профи


Вступление в Клуб: 04.02.2008
СообщениеВт Фев 14, 2012 11:46    Ответить с цитатой
Полезность: Нет оценки
[RUNTIME].[XML_DB]
maestro
Профи


Вступление в Клуб: 12.10.2010
СообщениеВт Фев 14, 2012 13:00    Ответить с цитатой
Полезность: 1
svn пишет:
[RUNTIME].[XML_DB]


Простая обертка dbms_xml... пакетов.
De Mian
Профи


Вступление в Клуб: 26.09.2008
СообщениеЧт Апр 23, 2020 10:01    Ответить с цитатой
Полезность: Нет оценки
maestro пишет:
dnk_dz пишет:
самый простой и эффективный способ создания xml - через обычную строковую переменную без использования парсера/модели.


!! Не вздумайте так делать!!
Дело в том, что при создании XML стандартным парсером, выходной XML получается валидным! Разработчику нет нужды заморачиваться экранированием спецсимволов, вложенныхь XML-конструкций, кодировками и прочей херью, которая может не отвалидироваться на стороне приёмника. Стандартный парсер просто не даст Вам создать невалидный XML!

Собирать XML c F1 конкатенации в наше время - сродни каменному топору.
ИМХО, лучше потратить некоторое количество времени на изучение XML+XSD+XSLT, и затем эффективно пользоваться этими инструментами. Они дают возможность БЫСТРО создавать НАДЕЖНЫЕ приложения.


Забавно читать это в 2020, году. Особенно после проекта внедрения в одном крупном банке , в который в качестве ноу-хау была преподнесена "технология" собирания xml именно путем конкатинации с string и clob. Причем "технология" эта пришла из другого, еще более крупного банка.
Ощущение было правда как будто работаю не с каменным топором, а как будто строю мост из навоза обычной лопатой.

dnk_dz пишет:
самый простой и эффективный способ создания xml - через обычную строковую переменную без использования парсера/модели.


Самое смешное в таких наваторах, это как они решают обратную задачу, по разбору xml. Тут что-то самый простой способ без использования парсера/модели не работает и они уже начинают слушают взрослых дядей.


Последний раз редактировалось: De Mian (Чт Апр 23, 2020 10:16), всего редактировалось 1 раз
De Mian
Профи


Вступление в Клуб: 26.09.2008
СообщениеЧт Апр 23, 2020 10:12   Re: Простой разбор документов XML Ответить с цитатой
Полезность: Нет оценки
dnk_dz пишет:
Может, кому пригодится.
Недавно столкнулся с проблемой разбора различных видов XML документов. После написания километров кода для разбора каждого XML документа в отдельности, пришел к мысли, что в таком темпе я буду долго писать обработку десятка XML документов. А если нужно будет добавить обработку еще двадцати? В общем, пришли к мысли, что проще XML выгрузить в PL/SQL таблицу и ее уже обрабатывать. Так оказалось гораздо проще.


Далеко продвинулся в этой теме ?
Аналогичные сомнения терзали и меня. В итоге я в цфт запилил механизм. Описываю структуру, описываю какие поля читаются, а какие пишутся. Некий декларативный подход, когда я описываю что мне нужно, но не как это делать. А "как это делать" определяется подключением движка. И в итоге "декларация" компилируется либо в процедуры для работы с xml, либо для работы с cit_xml ,ну и json.
Подробней тут http://cftclub.ru/viewtopic.php?t=5442

Но сейчас другая проблема встала. Огромные xsd. Ищу решение по автоматическому перекладыванию xsd в описание структур на pl+/plsql. Тема парсинга/сбора этих огромных структур решена уже(выше написал), но вот просто описание структур соответствующих элементам xsd, оказывается тоже рутинной и монотонной задачей. Нужна автоматизация.
Mourinjo
Участник со стажем


Вступление в Клуб: 21.12.2010
СообщениеЧт Май 14, 2020 11:53   Парсинг XML UTF8 Ответить с цитатой
Полезность: Нет оценки
Добрый день, уважаемые гуру ЦФТ!

Просьба помочь, может кто сталкивался с такой проблемой ....

Пытаюсь распарсить XML файл, содержащий знаки (2 байта)
с помощью парсера XML_DOM

&xml.parseClob(parser, doc);


выходит ошибка

ORA-20100: Error occurred while parsing:
Fatal Error at file LOB, line 1, char 39
An exception occurred! Type:UTFDataFormatException, Message:invalid byte 1 (?) of a 1-byte sequence.
: ORA-06512: на "IBS.XRC_XMLPARSER", line 40
ORA-06512: на "IBS.XRC_XMLPARSER", line 256
ORA-06512: на "IBS.Z$RUNTIME_XML_DOM", line 61
ORA-06512: на "IBS.Z$RUNTIME_LIB_XML_PL", line 86


Кто нибудь ранее парсил XML содержащие знаки занимающие 2 байта, просьба привести примеры если есть?

Парсер не понимает UTF8 кодировку ? Или проблема в чем то другом ? Может парсер XML_DOM не тот использую ? Поискал в инете, но ничего не нашел толкового.
Может это баг Oracle ?
De Mian
Профи


Вступление в Клуб: 26.09.2008
СообщениеЧт Май 14, 2020 12:05   Re: Парсинг XML UTF8 Ответить с цитатой
Полезность: Нет оценки
Mourinjo пишет:

Пытаюсь распарсить XML файл, содержащий знаки (2 байта)
с помощью парсера XML_DOM

Может парсер XML_DOM не тот использую ? Поискал в инете, но ничего не нашел толкового.
Может это баг Oracle ?

XML_DOM. Это не ораклянная библиотека. Это реализация парсера Xerces от ЦФТ.
Попробуй XML_DB . Это обертка над dbms_xmldom.
Отпишись о результате обязательно. Тоже вопрос интересует.
Mourinjo
Участник со стажем


Вступление в Клуб: 21.12.2010
СообщениеЧт Май 14, 2020 15:54    Ответить с цитатой
Полезность: Нет оценки
Опытным путем , выявлено что такая ошибка, как правило, возникает когда кодировка тела XML не соответствует кодировке в заголовке XML :
<?xml ... encoding=???? ?>
Провертьте, парсер читает кодировку из заголовка и дальше пытается разбирать сообщение в указанной кодировке????

Теперь нужно понять как работает парсер xerces от фирмы ЦФТ на предмет проверки кодировки в заголовке и в теле XML.

Где глядеть и как ? Кто поможет ?
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Справочник PL/PLUS: Функции, примеры, приёмы Часовой пояс: GMT + 3
На страницу Пред.  1, 2, 3  След.
Страница 2 из 3

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru