Показаны сообщения с ярлыком XML. Показать все сообщения
Показаны сообщения с ярлыком XML. Показать все сообщения

23.07.2018

Анмаршаллинг XML в класс при помощи JAXB

public JAXBElement processFile(File file){
        Class clazz = SomePojo.class;
        JAXBElement jaxbElement = null;
        try {
            JAXBContext jaxbContext = JAXBContext.newInstance(clazz);
            Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
            jaxbElement = unmarshaller.unmarshal(new StreamSource(file), clazz);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return jaxbElement;
    }

27.08.2015

Парсер SAX

SAX - альтернатива стандартному парсеру DOM, который в силу особенностей реализации (создание в памяти объекта XMLDocument, содержащего целиком весь файл), подходит только для распарсивания маленьких xml-документов.

Фишка парсера в том, что поток InputStream обрабатывается последовательно и к тем или иным событиям применяется пользовательская логика:
             SAXParserFactory factory = SAXParserFactory.newInstance();
             SAXParser parser;
             parser = factory.newSAXParser();
             MySAXParser prsHandler = new MySAXParser();
             parser.parse(is, prsHandler);
, где is - объект класса InputStream, MySAXParser - класс с перекрытыми методами обработки событий
public class MySAXParser extends DefaultHandler{
    private String currentParameterTypes;
    private String currentQName;
 
    @Override
    public void startDocument(){  //событие начала парсинга
        System.out.println("start parse document;");
    }
   
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes){
        // встретили элемент
        this.currentParameterTypes = qName;
    }
   
    @Override
    public void endElement(String uri, String localName, String qName){
        // вышли из элемента
    }
   
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        // получает значение тега/атрибута this.currentParameterTypes
        String value = new String(ch, start, length);
    }
}
Ниже - график заполнения heap'a во время распарсивания файда в 150МБ.




08.06.2014

Отчет из данных ViewObject

Мы можем выдать пользователю отчет сразу по нажатию кнопки, без создания конкаррента. Такое удобно, например, при выгрузке в Excel результатов с поисковой формы.

Ключевые моменты.
1) Формирование XMLNode c данными из VO. Первый параметр - глубина структуры XML.
XMLNode xmlNode = (XMLNode)reportVO.writeXML(4, XMLInterface.XML_OPT_ALL_ROWS);
2) Добавление доп.параметров в XML (параметры шапки)
XMLNode xmlNode = (XMLNode)am.invokeMethod("fillWithVODataset");
XMLDocument doc = xmlNode.getDocument();
Element elem = doc.createElement("ReportInfo");
Element elemPeriod = doc.createElement("SomeParameter");
Text startPeriodVal = doc.createTextNode((String)someBean.getValue(pageContext));
elemPeriod.appendChild(startPeriodVal);
elem.appendChild(elemPeriod);
XMLNode firstChild = (XMLNode)xmlNode.getFirstChild();
// xmlNode пуст, если VO был пуст
if (firstChild != null){
  XMLNode parent = (XMLNode)firstChild.getParentNode();
  parent.appendChild(elem); 
}else{
  // добавляем элемент в корень
  xmlNode.appendChild(elem);
}
3) Натягиваем данные на существующий шаблон XDO
select lb.file_data
from xdo_templates_b tmp,
        xdo_lobs lb
where tmp.template_code = :1
   and tmp.application_short_name = :2
   and lb.application_short_name = tmp.application_short_name
   and lb.lob_code = tmp.data_source_code
   and lb.lob_type = 'TEMPLATE'
   and sysdate between tmp.start_date and nvl(tmp.end_date,sysdate)
4) Формируем выходной поток с помощью класса oracle.apps.xdo.template.FOProcessor

Шаблон для нашего отчета будет иметь особенности. Имя группы будет составлено как Имя_VO || 'Row'. Например, если VO отчета назывался ReportVO, то группа будет названа ReportVORow. Имена элементов будут совпадать с именами атрибутов VO. Отдельная группа - вручную добавленные параметры шапки:
<dataStructure>
  <group name="reportVORow" source="reportVORow">
   <element name="ATTR1" value="ATTR1"/>
   <element name="ATTR2" value="ATTR2"/>
   ...
  <group name="ReportInfo" source="ReportInfo">
   <element name="SomeParameter" value="SomeParameter"/>
   ...

25.06.2012

Oracle XML Publisher: простейший отчет в RTF

Процесс создания отчета состоит из этапов: создание Шаблона определения данных (Data Definition), создание RTF шаблона представления данных конечному пользователю, создание Параллельного (concurrent) приложения, добавление созданного приложения в группу запросов пользователя, выполнение отчета с параметрами.

13.03.2012

Передача XML>32k через ADO в Oracle

При работе с XML+ADO+Oracle всё прекрасно, пока размер потока с XML не превышает 32k

18.01.2012

Формирование XML c помощью DBMS_XMLDOM

Создание объекта XML с помощью пакета DBMS_XMLDOM с передачей в виде CLOB