XML generate-from cyber

PLSQL NOTE--------XML generate

在PL/SQL中利用XML ,Oracle提供了几个组件,让开发人员能轻松地利用XML技术。这些组件包括:
1.XML分析程序。即用来分析、构造和验证XML文档。
2.XPath引擎。它是使用Xpath(XML标准的另一个元素)说明语法在内存中搜索XML文档的实用程序。SLT处理器。它在Oracle数据库中支持XSLT,允许您把XML文档转换成其他格式。
3.XML SQL实用程序。可以使用SQL产生XML文档,使您可以在Oracle数据库表格中轻松地插入基于XML的数据。
对于PL/SQL开发人员而言,XML分析程序是最重要的组件。通过它,您可以在Oracle数据库中分析、操纵和转换XML文档。XML分析程序由一套APIs(应用程序编程接口)构成。

===================================================================================================================================================================================

xml generate

生成Test.xml,内容如下


1

2

3

4

5

6

7

8

9

10

<staff content = "name and id">

    <member>

      <name>Arwen</name>

    <eno>123</eno>

  </member>

  <member>

      <name>Tom</name>

    <eno>456</eno>

  </member>  

</staff>

1.生成xml的plsql code:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

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;

2.将xml encode 成clob 写入文件:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

declare

    l_f utl_file.file_type;

    clobpart varchar2(2048);

    offset integer;

    l_xmltype XMLTYPE;

    cloblen integer;

    response_clob CLOB;

    resp_domdoc DBMS_XMLDOM.DOMDOCUMENT;

begin

    l_f  := utl_file.fopen(‘TEST_DIR‘,l_full_file_name,‘w‘);

    utl_file.put_line(l_f,‘<?xml version="1.0" encoding="utf-8" standalone="yes"?>‘||chr(13));

    resp_domdoc := SoapEncPrcnScnrPckgRead.encd_root_prcn_scnr_pckg_read(p_psp_resp_doc);

    l_xmltype := dbms_xmldom.getXmlType(resp_domdoc);

    dbms_xmldom.freeDocument(resp_domdoc);

    response_clob := l_xmltype.getClobVal;

    cloblen := LENGTH(response_clob);

    while offset < cloblen

    loop

        clobPart := dbms_lob.substr(response_clob, 1024, offset);

        utl_file.put(l_f, clobPart);

        offset := offset + 1024;

    end loop;

    utl_file.fflush(l_f);

    utl_file.fclose(l_f);

end;

/

3.结合使用XMLDOM和utl_file
  
 这样生成XML文件非常方便,能满足一般的应用了.但是XMLDOM有个缺点,就是一次性在内存中生成所有xml文件内容,然后写入到磁盘文件中.如果
xml文件太大,比如说有个table有几个G,想把它保存成xml文件.这样可能就会出现内存不足,生成文件失败.那该咋整呢?
    可能首先想到的是用UTL_FILE去生成文件.

里面的内容全部手动写成xml格式的,然后保存成xml后缀的文件.这样确实可行.但有个麻烦问题时如果一些节点内容含有xml的五个保留字符的话
(&,<,>,‘,"
分别是和号,小于号,大于号,单引号,双引号),我们如果以文本方式打开xml文件是看不到节点内容里面有这些保留字的,都转换成了对应
的&amp, &gt, &lt, &apos,
&quot.节点指定的是上面的Arwen或123,假如有名字(A&r<w>e‘n")则保存到xml文件中应该改成
(A&ampr&gtw&lte&aposn&quot).如果用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才行
    UTL_FILE.PUT_LINE_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.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会覆盖之前的内容
      UTL_FILE.PUT_LINE_NCHAR(STAFFINFO ,v_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‘,‘a‘,32767);
    UTL_FILE.PUT_LINE_NCHAR(STAFFINFO ,‘</staff>‘);
    UTL_FILE.FFLUSH(STAFFINFO );
    UTL_FILE.FCLOSE(STAFFINFO );
end;
时间: 2024-10-10 06:38:03

XML generate-from cyber的相关文章

通过generate解析SQL日志生成xml进行SQL回放

查看Oracle redo日志来分析SQL执行记录 1)设置Oracle数据字典导出路径参数(可选) shutdown immediatealter system set UTL_FILE_DIR='/opt/oracle/utl' scope=spfile; execute dbms_logmnr_d.build(dictionary_filename => 'logminer_dict.ora', dictionary_location => '/opt/oracle/utl');star

PLSQL NOTE--------XML generate

在PL/SQL中利用XML ,Oracle提供了几个组件,让开发人员能轻松地利用XML技术.这些组件包括:1.XML分析程序.即用来分析.构造和验证XML文档.2.XPath引擎.它是使用Xpath(XML标准的另一个元素)说明语法在内存中搜索XML文档的实用程序.SLT处理器.它在Oracle数据库中支持XSLT,允许您把XML文档转换成其他格式.3.XML SQL实用程序.可以使用SQL产生XML文档,使您可以在Oracle数据库表格中轻松地插入基于XML的数据.对于PL/SQL开发人员而言

python文件目录遍历保存成xml文件代码

Linux服务器有CentOS.Fedora等,都预先安装了Python,版本从2.4到2.5不等,而Windows类型的服务器也多数安装了Python,因此只要在本机写好一个脚本,上传到对应机器,在运行时修改参数即可. Python操作文件和文件夹使用的是os库,下面的代码中主要用到了几个函数: os.listdir:列出目录下的文件和文件夹 os.path.join:拼接得到一个文件/文件夹的全路径 os.path.isfile:判断是否是文件 os.path.splitext:从名称中取出

PHP开发第一个扩展

首先声明:我们要构建的是扩展或者模块名为hello_module.该模块提供一个方法:hello_word. 一.PHP环境的搭建 1)一般使用源码包编译安装,而不是binary包安装.因为使用PHP的二进制分发包安装有些冒险,这些版本倾向于忽略./configure的两个重要选项,它们在开发过程中很便利: 第一个--enable-debug.这个选项将把附加的符号信息编译进PHP的执行文件,以便如果发生段错误,你能从中得到一个内核转储文件,使用gdb追踪并发现什么地方以及为什么会发生段错误.

pig的安装及使用

1.下载软件: wget http://apache.fayea.com/pig/pig-0.15.0/pig-0.15.0.tar.gz 2.解压 tar -zxvf pig-0.15.0.tar.gz mv pig-0.15.0 /usr/local/ ln -s pig-0.15.0 pig 3.配置环境变量: export PATH=PATH=$HOME/bin:/usr/local/hadoop/bin:/usr/local/hadoop/sbin:/usr/local/pig/bin

PHP扩展编写示例

1.生成描述文件,包含对函数等的定义 [[email protected] php-extension]$ cat hello_cy.def string self_concat(string str, int n); 2.进入PHP源码的ext目录 [[email protected] ext]$ pwd /home/chengyi/centos_soft_install/php-5.2.5/ext 3.查看ext_skel的帮助,我们主要用到的是 --extname=module  定义将要

Webx框架:AutoConfig

AutoConfig AutoConfig是一个小工具,用于解决不同机器之间配置不同的问题.有时候有些配置,比如数据库地址.缓存地址等,这些配置与环境有关.每次在不同的环境中都需要重新修改配置,比较麻烦.解决这个问题有两种方法,一种是通过maven中的filter工具,另外一种是使用autoconfig.maven-filter工具的缺点是,当项目编译打包之后,无法再修改配置文件.而autoconfig可以通过一个脚本指令,直接修改打包过的配置文件,不需要重新编译,这样节省了不少时间. 接下来介

菜鸟学php扩展 之 自动生成的扩展框架详解(二)

前言 上一文:菜鸟学php扩展 之 hello world(一),不问所以然的,强行与php扩展say hello了.对于ext_skel自动生成的框架,将在本文进行详解,当作备忘录. 正文 ext_skel的用法 ./ext_skel --extname=module [--proto=file] [--stubs=file] [--xml[=file]] [--skel=dir] [--full-xml] [--no-help] --extname=module module is the

工作总结之添加数据库

1.首先在idb中新建任务--表结构变更,在里面设计好后,同步到线下数据库. 2.在main/resources里添加sqlmap_dingtalk.xml文件,然后在sqlmap-config中注册该文件 <sqlMap resource="com/taobao/cun/biz/dingtalk/sqlmaps/sqlmap_dingtalk.xml"/> 3.在cuntaocenter-core核心库里的resources的文件beans-persistence里注册c