将数据库中的数据发布为XML文档
一,使用XML SPY 工具
1,在 转换(C) 中选择 导入数据库数据(Import Database 。。。)。
2,配置数据源。
3,选择数据库表,获取表中的数据。
例如Oracle的EMP表
select EMPNO, ENAME,JOB,MGR,
to_char(HIREDATE,'yyyy-mm-dd') as HIREDATE, SAL,COMM, DEPTNO
from emp;
4,选择预览,设置导入。
(1)匹配数据类型。
例如Oracle的EMP表中的HIREDATE列。对日期进行格式化。
to_char(HIREDATE,'yyyy-mm-dd') as HIREDATE,
(2)配置元素和属性。
默认“<>”表示元素。
“=” 号表示属性。
二,从Oracle中构建带标记的 XML 文档
SQL/XML 是 SQL 语言标准(ANSI/ISO)的扩展,包含将关系数据转化成 XML 的 XML 发布函数。
Oracle包含内置的 SQL/XML 发布函数,
这些函数允许在大型字符对象(CLOB 类型,DB2 UDB 的一种内置数据类型)中创建带标记的 XML 文档。
可以使用 SELECT 语句装配需要的 XML 节点,然后通过把输出定向到文件而捕捉带标记的 XML 节点。
也可使用 INSERT 语句将生成的文本插入表中。
这里主要介绍xmlelement函数,xmlforest函数,xmlattributes函数,xmlagg函数
以下示例使用Oracle的EMPA表(Creat Table EMPA as select * from emp;)
1,xmlelement函数:构造一个命名的 XML 元素节点。XMLELEMENT 是一个标量函数。
参数包括一个元素名、可选的名称空间声明、可选的属性,以及零个或多个组成元素内容的表达式。
XMLELEMENT 函数可以嵌套。
(1)指定元素内容
示例1:注意参数的不同表现形式
select xmlelement(NAME 元素名) from empa; --一个没有内容的元素,一般用于构建枝干元素,嵌套构建叶子元素。
select xmlelement(NAME 元素名, '元素值') from empa;
select xmlelement(NAME ename, ename) from empa;
select xmlelement(NAME "ename", ename) from empa;
示例2:注意参数的不同表现形式
select xmlelement(ename, ename) from empa;
select xmlelement("ename", ename) from empa;
示例3:
select xmlelement(NAME emp, --根元素emp
xmlelement(ename,ename), --子元素ename
xmlelement(job,job), --子元素job
xmlelement(comm,comm) --子元素comm
) as xml
from empa;
(2)构建有属性的元素
示例:
select xmlelement(emptab,
xmlelement(emp,
xmlattributes(empno AS empno,MGR AS MGR,DEPTNO AS DEPTNO),
xmlelement(NAME ename,xmlattributes(empno AS no), ename),
xmlelement(job,job),
xmlelement(COMM,comm)
)
) as xml
from empa;
2,xmlforest函数 :构造一个 XML 元素节点序列(森林)。XMLFOREST 是一个标量函数,
示例1:
select xmlforest(ENAME "ename", JOB "job",
to_char(HIREDATE,'yyyy-mm-dd') "hiredate", SAL "sal",COMM "comm")
from empa;
示例2:
select xmlelement(NAME emp,
xmlattributes(empno as empno,MGR as MGR,DEPTNO as DEPTNO),
xmlforest(ename as ename,job as job,hiredate as hiredate,sal as sal,comm as comm)
) as xml
from empa;
3,xmlattributes函数:为 XML 元素节点构造一个或多个 XML 属性节点。XMLATTRIBUTES 是一个标量函数。
示例1:
select xmlelement(emp,
xmlattributes('属性值' AS "属性名")
) AS xml
from empa;
select xmlelement(emp,
xmlattributes(empno as empno)
) AS xml
from empa;
select xmlelement(emp,
xmlattributes(empno AS "empno")
) AS xml
from empa;
示例2:
select xmlelement(emptab,
xmlelement(emp,
xmlattributes(empno AS empno,MGR AS MGR,DEPTNO AS DEPTNO),
xmlelement(NAME ename, xmlattributes(empno AS no),ename),
xmlelement(job,job),
xmlelement(COMM,comm)
)
) as xml
from empa;
4,xmlconcat函数:连接两个或多个 XML 值(XML表达式)。
示例:
select xmlelement(NAME emp,
xmlconcat(
xmlelement(NAME ename, ename),
xmlelement(NAME sal, sal)
)
) as xml
from empa;
5,XMLAGG函数:XMLAGG 函数在生成的 XML 值中将 XML 值聚合为一系列的项。XMLAGG 是一种聚合(列)函数。必须要有group by子句。
该函数可以用来增强XML树状结构的层次
示例:
select xmlelement(NAME emptab,
xmlelement(NAME emp,
xmlelement(NAME ename, e.ename),
xmlelement(comm,e.comm),
xmlagg(xmlelement(NAME dept,
xmlattributes(d.deptno AS deptno),xmlelement(NAME dname,d.dname),xmlelement(NAME loc,d.loc))
)
)
)
from empa e, dept d
where e.deptno = d.deptno
group by e.ename,e.comm;
6,XMLNAMESPACES函数:从参数中构造 XML 名称空间声明。声明在 XMLELEMENT 和 XMLFOREST 函数生成的元素的作用范围内。
综合示例:
单表示例:
select xmlelement(NAME empTab,
xmlelement(NAME emp,
xmlattributes(empno AS empno,MGR AS MGR,DEPTNO AS DEPTNO),
xmlforest(ename AS ename,job as job,hiredate as hiredate,sal as sal,comm as comm)
)
)
from empa;
存在主从表关系的示例(Oracle中的dept和emp):将dept表和emp表中的数据生成XML文档输出
示例1:
select xmlelement(NAME deptTab,
xmlattributes(d.deptno AS deptno),
xmlelement(NAME dname,d.dname),
xmlelement(NAME loc, d.loc),
xmlagg(xmlelement(NAME empTab,
xmlelement(NAME emp,
xmlattributes(e.empno AS empno,e.MGR AS MGR,e.DEPTNO AS DEPTNO),
xmlelement(NAME ename,e.ename),
xmlelement(job,e.job),
xmlelement(comm,e.comm)
)
)
)
).GETSTRINGVAL() AS XML
from empa e, dept d
where e.deptno = d.deptno
group by d.deptno,d.dname,d.loc;
示例2:
select xmlelement(NAME deptTab, xmlattributes(d.deptno AS deptno), xmlelement(NAME dname, d.dname), xmlelement(NAME loc, d.loc), xmlelement(NAME empTab, xmlelement(NAME emp, xmlattributes(e.empno AS empno,e.MGR AS MGR,e.DEPTNO AS DEPTNO), xmlelement(NAME ename,e.ename), xmlelement(job,e.job), xmlelement(comm,e.comm) ) ) ).GETSTRINGVAL() AS XML from empa e, dept d where e.deptno = d.deptno;
结果如下:
XML
--------------------------------------------------------------------------------
<DEPTTAB DEPTNO="10"><DNAME>ACCOUNTING</DNAME><LOC>NEW YORK</LOC><EMPTAB><EMP EM
PNO="7782" MGR="7839" DEPTNO="10"><ENAME>CLARK</ENAME><JOB>MANAGER</JOB><COMM></
COMM></EMP></EMPTAB></DEPTTAB>
<DEPTTAB DEPTNO="10"><DNAME>ACCOUNTING</DNAME><LOC>NEW YORK</LOC><EMPTAB><EMP EM
PNO="7839" DEPTNO="10"><ENAME>KING</ENAME><JOB>PRESIDENT</JOB><COMM></COMM></EMP
></EMPTAB></DEPTTAB>
<DEPTTAB DEPTNO="10"><DNAME>ACCOUNTING</DNAME><LOC>NEW YORK</LOC><EMPTAB><EMP EM
PNO="7934" MGR="7782" DEPTNO="10"><ENAME>MILLER</ENAME><JOB>CLERK</JOB><COMM></C
OMM></EMP></EMPTAB></DEPTTAB>
XML
--------------------------------------------------------------------------------
<DEPTTAB DEPTNO="20"><DNAME>RESEARCH</DNAME><LOC>DALLAS</LOC><EMPTAB><EMP EMPNO=
"7369" MGR="7902" DEPTNO="20"><ENAME>SMITH</ENAME><JOB>CLERK</JOB><COMM></COMM><
/EMP></EMPTAB></DEPTTAB>
<DEPTTAB DEPTNO="20"><DNAME>RESEARCH</DNAME><LOC>DALLAS</LOC><EMPTAB><EMP EMPNO=
"7876" MGR="7788" DEPTNO="20"><ENAME>ADAMS</ENAME><JOB>CLERK</JOB><COMM></COMM><
/EMP></EMPTAB></DEPTTAB>
<DEPTTAB DEPTNO="20"><DNAME>RESEARCH</DNAME><LOC>DALLAS</LOC><EMPTAB><EMP EMPNO=
"7902" MGR="7566" DEPTNO="20"><ENAME>FORD</ENAME><JOB>ANALYST</JOB><COMM></COMM>
XML
--------------------------------------------------------------------------------
</EMP></EMPTAB></DEPTTAB>
<DEPTTAB DEPTNO="20"><DNAME>RESEARCH</DNAME><LOC>DALLAS</LOC><EMPTAB><EMP EMPNO=
"7788" MGR="7566" DEPTNO="20"><ENAME>SCOTT</ENAME><JOB>ANALYST</JOB><COMM></COMM
></EMP></EMPTAB></DEPTTAB>
<DEPTTAB DEPTNO="20"><DNAME>RESEARCH</DNAME><LOC>DALLAS</LOC><EMPTAB><EMP EMPNO=
"7566" MGR="7839" DEPTNO="20"><ENAME>JONES</ENAME><JOB>MANAGER</JOB><COMM></COMM
></EMP></EMPTAB></DEPTTAB>
<DEPTTAB DEPTNO="30"><DNAME>SALES</DNAME><LOC>CHICAGO</LOC><EMPTAB><EMP EMPNO="7
XML
--------------------------------------------------------------------------------
499" MGR="7698" DEPTNO="30"><ENAME>ALLEN</ENAME><JOB>SALESMAN</JOB><COMM>300</CO
MM></EMP></EMPTAB></DEPTTAB>
<DEPTTAB DEPTNO="30"><DNAME>SALES</DNAME><LOC>CHICAGO</LOC><EMPTAB><EMP EMPNO="7
698" MGR="7839" DEPTNO="30"><ENAME>BLAKE</ENAME><JOB>MANAGER</JOB><COMM></COMM><
/EMP></EMPTAB></DEPTTAB>
<DEPTTAB DEPTNO="30"><DNAME>SALES</DNAME><LOC>CHICAGO</LOC><EMPTAB><EMP EMPNO="7
654" MGR="7698" DEPTNO="30"><ENAME>MARTIN</ENAME><JOB>SALESMAN</JOB><COMM>1400</
COMM></EMP></EMPTAB></DEPTTAB>
XML
--------------------------------------------------------------------------------
<DEPTTAB DEPTNO="30"><DNAME>SALES</DNAME><LOC>CHICAGO</LOC><EMPTAB><EMP EMPNO="7
900" MGR="7698" DEPTNO="30"><ENAME>JAMES</ENAME><JOB>CLERK</JOB><COMM></COMM></E
MP></EMPTAB></DEPTTAB>
<DEPTTAB DEPTNO="30"><DNAME>SALES</DNAME><LOC>CHICAGO</LOC><EMPTAB><EMP EMPNO="7
844" MGR="7698" DEPTNO="30"><ENAME>TURNER</ENAME><JOB>SALESMAN</JOB><COMM>0</COM
M></EMP></EMPTAB></DEPTTAB>
<DEPTTAB DEPTNO="30"><DNAME>SALES</DNAME><LOC>CHICAGO</LOC><EMPTAB><EMP EMPNO="7
521" MGR="7698" DEPTNO="30"><ENAME>WARD</ENAME><JOB>SALESMAN</JOB><COMM>500</COM
M></EMP></EMPTAB></DEPTTAB>
XML
--------------------------------------------------------------------------------