18.01.2012

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

Создание объекта XML с помощью пакета DBMS_XMLDOM с передачей в виде CLOB
function XMLBuilder return clob is
  doc            DBMS_XMLDOM.DOMDocument; -- объект документа
  rootElement    DBMS_XMLDOM.DOMElement; -- корневой элемент параметров Л/С
  paramsElement1 DBMS_XMLDOM.DOMElement; -- элемент 1 уровня 
  paramsElement2 DBMS_XMLDOM.DOMElement; -- элемент 2 уровня
  node           DBMS_XMLDOM.DOMNode; -- узел
  c              CLOB;
  -- курсор для последовательной генерации элементов
  cursor cur is
    select rownum from all_users where rownum < 5;
  x integer; -- хранение переменной из курсора
begin
  doc         := dbms_xmldom.createDocument('http://www.w3.org/2001/XMLSchema',
                                            null,
                                            null);
  rootElement := DBMS_XMLDOM.createElement(doc, 'ROOT'); -- корневой элемент
  node        := DBMS_XMLDOM.appendChild(DBMS_XMLDOM.makeNode(doc),
                                         DBMS_XMLDOM.makeNode(rootElement));
  DBMS_XMLDOM.setAttribute(rootElement, 'param1', 1); -- атрибуты корн. эл.    
  DBMS_XMLDOM.setAttribute(rootElement, 'param2', 'v');
  -- 1 уровень
  paramsElement1 := DBMS_XMLDOM.createElement(doc, 'LEVEL1');
  -- paramsElement1 является дочерним по отношению к rootElement
  node := DBMS_XMLDOM.appendChild(DBMS_XMLDOM.makeNode(rootElement),
                                  DBMS_XMLDOM.makeNode(paramsElement1));
  -- узлы-элементы 1 уровня
  open cur;
  loop
    fetch cur
      into x;
    exit when cur%NOTFOUND;
    paramsElement2 := DBMS_XMLDOM.createElement(doc, 'UNIT');
    helpNode := DBMS_XMLDOM.appendChild(DBMS_XMLDOM.makeNode(paramsElement1),
                                        DBMS_XMLDOM.makeNode(paramsElement2));
    DBMS_XMLDOM.setAttribute(paramsElement1, 'param', x);
  end loop;
  close cur;
  dbms_lob.createtemporary(c, true, dbms_lob.session);
  c := 'dddd'; -- так  работать не будет
  dbms_xmldom.writeToClob(doc, c);
  return('' || chr(10) || c);
end;
Результат:
<root param1="1" param2="v">
  <level1>
   <unit param="1"/>
   <unit param="2"/>
   <unit param="3"/>
   <unit param="4"/> 
  </level1>
</root> 

Комментариев нет :