Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Иерархический XML  [new]
Lav
Member

Откуда: Белокаменная
Сообщений: 220
Уважаемые гуру,

У меня есть иерархическая структура данных

select t.id, t.parent_id, t.value, t.code params t
start with t.parent_id is null
connect by prior t.Id = t.Id_Parent

Никак не могу понять, могу ли я средствами Oracle сформировать XML следующего вида

<CODE_PARENT attr="value">
   <CODE_CHILD attr="value"> </CODE_CHILD>
</CODE_PARENT>

Основная проблема с именованием NOD-ов, никак не могу скрестить DBMS_XMLGEN.newcontextFromHierarchy c XMLFormat

Есть идеи?
1 июн 10, 16:19    [8870419]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический XML  [new]
mayton
Member

Откуда: loopback
Сообщений: 49764
Я-б попробовал это сделать на Java.
1 июн 10, 16:30    [8870567]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический XML  [new]
RnR
Member

Откуда: Moscow
Сообщений: 150
Интересная задача, актуальна для меня. Только у меня плоская структура вида КЛЮЧ | ЗНАЧЕНИЕ, где КЛЮЧ может начинаться со знака "+" или "-", что обозначает, соответственно, начало и конец ветки, либо просто имя ключа без дополнительных символов, что обозначает лист. Пока нормального решения не придумал.
7 июн 10, 11:31    [8900751]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический XML  [new]
mayton
Member

Откуда: loopback
Сообщений: 49764
Lav,

тема всё еще актуальна?
7 июн 10, 22:38    [8905222]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический XML  [new]
Lav
Member

Откуда: Белокаменная
Сообщений: 220
mayton
Lav,

тема всё еще актуальна?


Я написал рекурсивную порцедурку, которой собираю XML, но чувствую спиной, что это как-то не спортивно.
7 июн 10, 23:43    [8905319]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический XML  [new]
mayton
Member

Откуда: loopback
Сообщений: 49764
Поделись сорцом. Любопытно посмотреть.
7 июн 10, 23:48    [8905328]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический XML  [new]
Lav
Member

Откуда: Белокаменная
Сообщений: 220
mayton
Поделись сорцом. Любопытно посмотреть.


Function f_Create_Xml(pr_Id_plan plan.Id_plan%type) return clob
		--возвращает XML
	is		
		l_Clob clob;

	  Procedure pl_Get_Child(pr_Id_param_Parent param.Id_param_Parent%type:=null)
			Is
			Begin
					for l_crs in (Select  fp.Id_param,fp.Value,fpt.Var_Name
						from param fp join paramtype fpt on fpt.Id_paramtype=fp.Id_paramtype
						where nvl(fp.Id_param_Parent,-999)=nvl(pr_Id_param_Parent,-999)
						and fp.Id_plan=pr_Id_plan)
						Loop
							l_clob:=l_clob||' <'||l_crs.Var_Name||' value="'||l_crs.Value||'" >';
							pl_Get_Child(pr_Id_param_Parent=>l_crs.Id_param);
							l_clob:=l_clob||' </'||l_crs.Var_Name||'>';
						end loop;
			end;
	Begin
		for l_crs in (select * from roots fp where fp.Id_plan=pr_Id_plan)
			loop
		l_clob:='<?xml version="1.0" encoding="UTF-8"?>';		
		l_clob:=l_clob||'<ROOT date_start="'||to_char(l_crs.Start_Date,'DD.MM.YYYY')||'" date_end="'||to_char(l_crs.End_Date,'DD.MM.YYYY')||'"> ';
		pl_Get_Child;
		l_clob:=l_clob||'</ROOT>';
		end loop;
		return l_clob;
	end;

Приблизительно так.
8 июн 10, 00:13    [8905372]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический XML  [new]
OldOwl
Guest
create table params_ (id number, parent_Id number, value varchar(50), code varchar(50));

insert into params_ values (1, null, '1', 'c1');
insert into params_ values (2, 1, '2', 'c2');
insert into params_ values (3, 1, '3', 'c3');
insert into params_ values (4, 2, '4', 'c4');


declare
  c number;
  x xmltype;
begin
  c:=  dbms_xmlgen.newContextFromHierarchy(
'select 
   level, 
   xmlelement(x, 
      xmlattributes(t.code as "name", t.value as "value")
   ) 
from params_ t
start with t.parent_id is null
connect by prior t.Id = t.Parent_id');

-- как по мне, я п тут и остановился бы, но если надо извращений - можно... 

   dbms_xmlgen.setXSLT(c, xmltype('<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>
	<xsl:template match="/">
		<xsl:apply-templates/>
	</xsl:template>
	<xsl:template match="X">
		<xsl:variable name="nn" select="@name"/>
		<xsl:element name="{$nn}">
			<xsl:attribute name="value"><xsl:value-of select="@value"/></xsl:attribute>
			<xsl:apply-templates/>
		</xsl:element>
	</xsl:template>
</xsl:stylesheet>'));

  dbms_xmlgen.getXMlType(c, x);
  dbms_output.put_line(x.getStringVal());

  dbms_xmlgen.closeContext(c);
end;
/

8 июн 10, 02:47    [8905556]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический XML  [new]
Lav
Member

Откуда: Белокаменная
Сообщений: 220
OldOwl
create table params_ (id number, parent_Id number, value varchar(50), code varchar(50));

insert into params_ values (1, null, '1', 'c1');
insert into params_ values (2, 1, '2', 'c2');
insert into params_ values (3, 1, '3', 'c3');
insert into params_ values (4, 2, '4', 'c4');


declare
  c number;
  x xmltype;
begin
  c:=  dbms_xmlgen.newContextFromHierarchy(
'select 
   level, 
   xmlelement(x, 
      xmlattributes(t.code as "name", t.value as "value")
   ) 
from params_ t
start with t.parent_id is null
connect by prior t.Id = t.Parent_id');

-- как по мне, я п тут и остановился бы, но если надо извращений - можно... 

   dbms_xmlgen.setXSLT(c, xmltype('<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>
	<xsl:template match="/">
		<xsl:apply-templates/>
	</xsl:template>
	<xsl:template match="X">
		<xsl:variable name="nn" select="@name"/>
		<xsl:element name="{$nn}">
			<xsl:attribute name="value"><xsl:value-of select="@value"/></xsl:attribute>
			<xsl:apply-templates/>
		</xsl:element>
	</xsl:template>
</xsl:stylesheet>'));

  dbms_xmlgen.getXMlType(c, x);
  dbms_output.put_line(x.getStringVal());

  dbms_xmlgen.closeContext(c);
end;
/



Супер!!! Отлично работает. Жаль что я не владею XSL, придется читать. Спасибо.
8 июн 10, 10:42    [8906370]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить