Oracle有一个包XMLDOM,可以很方便的创建XML文件.举个简单的例子.生成Test.xml,内容如下
<staff content = "name and id">
<member >
<name>Arwen</name>
<eno>123</eno>
</member>
<member >
<name>Tom</name>
<eno>456</eno>
</member>
</staff>
---------------------------------------------------------------------------------------------------------------------------------------
--生成xml的代码
declare
doc XMLDOM.DOMDOCUMENT;
doc_node XMLDOM.DOMNODE;
root_node XMLDOM.DOMNODE;
user_node XMLDOM.DOMNODE;
item_node XMLDOM.DOMNODE;
root_elmt XMLDOM.DOMELEMENT;
user_elmt XMLDOM.DOMELEMENT;
item_elmt XMLDOM.DOMELEMENT;
item_text XMLDOM.DOMTEXT;
begin
doc := XMLDOM.NEWDOMDOCUMENT;
xmldom.setVersion(doc, '1.0');
xmldom.setCharset(doc, 'UTF-8');
--根节点
doc_node := XMLDOM.MAKENODE(doc);
root_elmt := XMLDOM.CREATEELEMENT(doc,'staff');
XMLDOM.SETATTRIBUTE(root_elmt,'content ','name and id');
root_node:=XMLDOM.APPENDCHILD(doc_node, XMLDOM.MAKENODE(root_elmt));
--节点1
user_elmt := XMLDOM.CREATEELEMENT(doc,'member');
user_node :=XMLDOM.APPENDCHILD(root_node, XMLDOM.MAKENODE(user_elmt));
item_elmt :=XMLDOM.CREATEELEMENT(doc,'name');
item_node :=XMLDOM.APPENDCHILD(user_node, XMLDOM.MAKENODE(item_elmt));
item_text := XMLDOM.CREATETEXTNODE(doc,'Arwen');
item_node:=XMLDOM.APPENDCHILD(item_node, XMLDOM.MAKENODE(item_text));
item_elmt :=XMLDOM.CREATEELEMENT(doc,'eno');
item_node :=XMLDOM.APPENDCHILD(user_node, XMLDOM.MAKENODE(item_elmt));
item_text := XMLDOM.CREATETEXTNODE(doc,'123');
item_node:=XMLDOM.APPENDCHILD(item_node, XMLDOM.MAKENODE(item_text));
--节点2
user_elmt := XMLDOM.CREATEELEMENT(doc,'member');
user_node :=XMLDOM.APPENDCHILD(root_node, XMLDOM.MAKENODE(user_elmt));
item_elmt :=XMLDOM.CREATEELEMENT(doc,'name');
item_node :=XMLDOM.APPENDCHILD(user_node, XMLDOM.MAKENODE(item_elmt));
item_text := XMLDOM.CREATETEXTNODE(doc,'tom');
item_node:=XMLDOM.APPENDCHILD(item_node, XMLDOM.MAKENODE(item_text));
item_elmt :=XMLDOM.CREATEELEMENT(doc,'eno');
item_node :=XMLDOM.APPENDCHILD(user_node, XMLDOM.MAKENODE(item_elmt));
item_text := XMLDOM.CREATETEXTNODE(doc,'456');
item_node:=XMLDOM.APPENDCHILD(item_node, XMLDOM.MAKENODE(item_text));
--写入操作系统文件中
XMLDOM.WRITETOFILE(doc,'DIR'||'\Test.xml');--注意必须先创建一个文件目录dir
--可以通过语句 : create or replace directory dir as 'd:\temp'
XMLDOM.FREEDOCUMENT(doc);
end;
这样生成XML文件非常方便,能满足一般的应用了.但是XMLDOM有个缺点,就是一次性在内存中生成所有xml文件内容,然后写入到磁盘文件中.如果xml文件太大,比如说有个table有几个G,想把它保存成xml文件.这样可能就会出现内存不足,生成文件失败.那该咋整呢?
1.可能首先想到的是用UTL_FILE去生成文件.
里面的内容全部手动写成xml格式的,然后保存成xml后缀的文件.这样确实可行.但有个麻烦问题时如果一些节点内容含有xml的五个保留字符的话(&,<,>,'," 分别是和号,小于号,大于号,单引号,双引号),我们如果以文本方式打开xml文件是看不到节点内容里面有这些保留字的,都转换成了对应的&, >, <, &apos, ".节点指定的是上面的Arwen或123,假如有名字(A&r<w>e'n")则保存到xml文件中应该改成(A&r>w<e&aposn").如果用xmldom会默认去转换,不用我们管了.如果用UTL_FILE必须手动写代码去转换.
2.结合使用XMLDOM和utl_file
假如有表staff(name varchar2(30), eno integer),里面有几个G的内容,要转换成开头讲的那种格式的xml文件
--生成xml的代码其中XML文件的头和尾用UTL_FILE直接写入文件中,节点内容用xmldom生成,然后写到clob变量中,再把clob变量值用utl_file写入到xml文件中
declare
STAFFINFO UTL_FILE.FILE_TYPE;
v_temp clob;
cursor c_table_info is
select name,eno from staff;
v_name varchar2(30);
v_eno integer;
doc XMLDOM.DOMDOCUMENT;
doc_node XMLDOM.DOMNODE;
root_node XMLDOM.DOMNODE;
user_node XMLDOM.DOMNODE;
item_node XMLDOM.DOMNODE;
root_elmt XMLDOM.DOMELEMENT;
user_elmt XMLDOM.DOMELEMENT;
item_elmt XMLDOM.DOMELEMENT;
item_text XMLDOM.DOMTEXT;
begin
--xml header
STAFFINFO :=utl_file.fopen_nchar('DIR','Test.xml','W',32767);--跟前面说的一样必须先创建一个directory才行
STAFFINFO :=utl_file.fopen_nchar(STAFFINFO ,'<staff content = "name and id">');
UTL_FILE.FFLUSH(STAFFINFO );--直接写入到磁盘文件中,不会停留在内存中
UTL_FILE.FCLOSE(STAFFINFO );
open c_table_info;
loop
fetch c_table_info into v_name,v_eno;
exit when c_table_info%notfound;
--XML节点
doc := XMLDOM.NEWDOMDOCUMENT;
xmldom.setVersion(doc, '1.0');
xmldom.setCharset(doc, 'UTF-8');
doc_node := XMLDOM.MAKENODE(doc);
user_elmt := XMLDOM.CREATEELEMENT(doc,'member');
user_node :=XMLDOM.APPENDCHILD(doc_node, XMLDOM.MAKENODE(user_elmt));
item_elmt :=XMLDOM.CREATEELEMENT(doc,'name');
item_node :=XMLDOM.APPENDCHILD(user_node, XMLDOM.MAKENODE(item_elmt));
item_text := XMLDOM.CREATETEXTNODE(doc,v_name);
item_node:=XMLDOM.APPENDCHILD(item_node, XMLDOM.MAKENODE(item_text));
item_elmt :=XMLDOM.CREATEELEMENT(doc,'eno');
item_node :=XMLDOM.APPENDCHILD(user_node, XMLDOM.MAKENODE(item_elmt));
item_text := XMLDOM.CREATETEXTNODE(doc,eno);
item_node:=XMLDOM.APPENDCHILD(item_node, XMLDOM.MAKENODE(item_text));
v_temp :=' ';
--写入到临时变量v_temp中
XMLDOM.WRITETOCLOB(doc,v_temp);
STAFFINFO :=utl_file.fopen_nchar('DIR','Test.xml','A',32767);--以a模式会在文件后添加内容,用w会覆盖之前的内容
STAFFINFO :=utl_file.fopen_nchar(STAFFINFO ,temp);
UTL_FILE.FFLUSH(STAFFINFO );
UTL_FILE.FCLOSE(STAFFINFO );
XMLDOM.FREEDOCUMENT(doc);
end loop;
close c_table_info;
--xml tail
STAFFINFO :=utl_file.fopen_nchar('DIR','Test.xml','W',32767);
STAFFINFO :=utl_file.fopen_nchar(STAFFINFO ,'</staff>');
UTL_FILE.FFLUSH(STAFFINFO );
UTL_FILE.FCLOSE(STAFFINFO );
end;
分享到:
相关推荐
完整的Oracle xmldom解析xml入参,经过测试,可以解析,成功入到数据表中。
dom动态生成使用XML DOM生成XML.pdf
XMLDOM教程.chm XMLDOM教程.chm,XMLDOM教程.chm,XML DOM教程 chm
Microsoft_XMLDOM帮助,xml document 对象模型手册
起先是dbms_xmldom.setCharset(doc, 'UTF8')不起作用,导出来的xml只有<?xml version="1.0"?>; 在setversion中加入:dbms_xmldom.setversion(doc, '1.0" encoding="UTF-8'); dbms_xmldom.writeToFile(doc, xml...
asp使用xmldom对象解析xml文件示例。
1、XMLDOMDocument类: XML对象文档 ->操作创建或读写(元素、节点、属性、注释)等 2、IXMLDOMNode类:每个元素或节点基本都会有的方法;作为元素和节点的基类调用 3、IXMLDOMAttribute类:就是元素或节点的属性类 4...
XMLDOM参考手册 ,包括XMLDOM、XMLDOMNode、XMLDOMSelection、XMLDOMList、XMLDOMElement、XMLDOMText、XMLDOMCDATASection、XMLDOMCharacterData、XMLDOMComment、XMLDOMDocumentType、XMLDOMEntity、...
XML&DOM帮助文档.rar 包含文件: XMLDOM教程·chm.chm XML入门手册.chm
Javascript操作XML Dom学习资料
oracle 解析 xml 简单直接 xmldom
chm格式,包括了xmldomcument对象的全部方法和属性
ASP通过XMLDom在服务器端操作XML文件的主要方法和实现
XML DOM 教程xml DOM 文档对象模型 会为了一下以前课本上的 对比了一下w3c的 还是原版的好
说明文档
xml解析,dom4j解析,xml循环节点处理,java代码 jar包执行20190331.rar
【学习 XML DOM】.pdf
dom+xpath读取xml并导入oracle.rar
java解析XML dom4j dom4j-1.6.1.jar dom4j.jarjava解析XML dom4j dom4j-1.6.1.jar dom4j.jar
网上下的xmldom教程都是联网版,于是考虑用Teleport Pro将网上教程一锅端,很小部分资源为提供,有需要请到http://www.w3school.com.cn/xmldom/index.asp下载。