在oracle 10g 下xml文件:<?xml version="1.0" encoding="gbk" ?> 
- <TRS>
- <REC>
  <INFO_ID>2</INFO_ID> 
  <br /> 
  <br /> 
  <作者>未知1</作者> 
  <br /> 
  <br /> 
  <修改日期>未知1</修改日期> 
  <br /> 
  <br /> 
  <分类>杂志1</分类> 
  <br /> 
  <br /> 
  <发表日期>2010</发表日期> 
  <br /> 
  <br /> 
  <字数>105</字数> 
  <br /> 
  <br /> 
  <录入员>王艳娜11</录入员> 
  <br /> 
  <br /> 
  <录入日期>2010.10.20</录入日期> 
  <br /> 
  <br /> 
  <日期>2010</日期> 
  <br /> 
  <br /> 
  <来源>炎黄春秋杂志11</来源> 
  <br /> 
  <br /> 
  <标题>新年致读者11</标题> 
  <br /> 
  <br /> 
  <正文>111在新年将至的时候,许多作者和读者来电来信,询问杂志社的情况和今年的编辑方针,借此机会,我们向大家汇报一下我们的情况和法111.</正文> 
  <br /> 
  <br /> 
  <正文字数>90</正文字数> 
  <br /> 
  <br /> 
  <状态>良</状态> 
  <br /> 
  <br /> 
  </REC>
- <REC>
  <INFO_ID>3</INFO_ID> 
  <br /> 
  <br /> 
  <作者>知1</作者> 
  <br /> 
  <br /> 
  <修改日期>知1</修改日期> 
  <br /> 
  <br /> 
  <分类>志1</分类> 
  <br /> 
  <br /> 
  <发表日期>2011</发表日期> 
  <br /> 
  <br /> 
  <字数>106</字数> 
  <br /> 
  <br /> 
  <录入员>王艳娜22</录入员> 
  <br /> 
  <br /> 
  <录入日期>2010.10.21</录入日期> 
  <br /> 
  <br /> 
  <日期>2011</日期> 
  <br /> 
  <br /> 
  <来源>杂志11</来源> 
  <br /> 
  <br /> 
  <标题>致读者11</标题> 
  <br /> 
  <br /> 
  <正文>111在新年将至的时候,许多作者和读者来电来信,询问杂志社的情况和今年的编辑方针,借此机会,我们向.</正文> 
  <br /> 
  <br /> 
  <正文字数>60</正文字数> 
  <br /> 
  <br /> 
  <状态>cha</状态> 
  <br /> 
  <br /> 
  </REC>
  </TRS>oracle所对应的表
create table test 

"rowid" rowid, 
"日期" char(20) default '' not null , 
"分类" char(150) default '' not null , 
"标题" char(2000) default '' not null , 
"正文" varchar2(4000) default '' not null , 
"字数" char(20) default '' not null , 
"正文字数" char(20) default '' not null , 
"录入日期" char(20) default '' not null , 
"录入员" char(20) default '' not null , 
"修改日期" char(20) default '' not null , 
"INFO_ID" char(10) default '' not null, 
"状态" char(50) default '' not null,
"发表日期" char(50) default '' not null,
"来源" char(50) default '' not null,
"作者" char(50) default '' not null
) 在oracle建的存储过程
CREATE OR REPLACE PROCEDURE addPerson(file_path VARCHAR2,log_path varchar2)   
 AS   
 --//XML解析器   
 xmlPar XMLPARSER.parser := XMLPARSER.NEWPARSER;   
 --//DOM文档对象   
 doc xmldom.DOMDocument;   
 len integer;   
 personNodes xmldom.DOMNodeList;   
 chilNodes xmldom.DOMNodeList;   
 tempNode xmldom.DOMNode;   
 tempArrMap xmldom.DOMNamedNodeMap;   
 --================================   
 --以下变量用于获取XML节点的值   
"日期" char(20);
"分类" char(150);
"标题" char(2000);
"正文" varchar2(4000);
"字数" char(20);
"正文字数" char(20);
"录入日期" char(20);
"录入员" char(20);
"修改日期" char(20);
"INFO_ID" char(10);
"状态" char(50);
"发表日期" char(50);
"来源" char(50);
"作者" char(50);          --(1)逗号结束!tmp VARCHAR2(100);        --(3)申明变量tmp
 --================================   
 BEGIN   
  xmlPar := xmlparser.newParser;   
  xmlparser.setErrorLog( xmlPar, log_path);   
  xmlparser.parse(xmlPar, file_path);   
  doc := xmlparser.getDocument( xmlPar );   
  -- 释放解析器实例   
  xmlparser.freeParser(xmlPar);   
  -- 获取所有PERSON元素   
  personNodes := xmldom.getElementsByTagName( doc,'REC');   
  len := xmldom.getLength( personNodes );   
  --遍历所有PERSON元素   
  FOR i in 0..len-1   
  LOOP   
  --获取第i个PERSON   
  tempNode := xmldom.item( personNodes, i );   
  --所有属性   
  tempArrMap := xmldom.getAttributes(tempNode);   
  --获取PERSONID的值   
  --pid := xmldom.getNodeValue(xmldom.getNamedItem(tempArrMap,'INFO_ID'));     --pid必须申明变量
  --获取所有子节点   
  chilNodes := xmldom.getChildNodes(tempNode);   
  --获取子节点的个数   
  tmp := xmldom.GETLENGTH( chilNodes );        --tmp也必须申明为变量
  --获取各个子节点的值  
  INFO_ID := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 0 )));   
  作者 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 1 )));   
  修改日期 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 2 )));   
  分类 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 3 )));   
  发表日期 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 4 )));   
  字数 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 5 )));
  录入员 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 6 )));  
  录入日期 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 7 )));  
  日期 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 8 )));  
  来源 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 9 )));   
  标题 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 10 )));  
  正文 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 11 )));  
  正文字数 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 12 )));  
  状态 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 13 )));  
  --插入数据   
  INSERT INTO test(INFO_ID,作者,修改日期,分类,发表日期,字数,录入员,录入日期,日期,来源,标题,正文,正文字数,状态) VALUES (INFO_ID,作者,修改日期,分类,发表日期,字数,录入员,录入日期,日期,来源,标题,正文,正文字数,状态);   
  COMMIT;   
  END LOOP;   
  -- 释放文档对象   
  xmldom.freeDocument(doc);   
  EXCEPTION   
  WHEN OTHERS THEN   
  DBMS_output.PUT_LINE(SQLERRM);   
 END addPerson; 
存储过程能够建立但是在PLSQL Developer总是提示‘提示非法的变量名和编号’xml文件中的数据添加不到oracle表中!
原帖地址:http://topic.csdn.net/u/20101109/15/6d99a224-1336-4f3e-9c4f-20c856b6a680.html?seed=142836150&r=69735911#r_69735911希望各位大大们能帮帮忙!! 

解决方案 »

  1.   

    你参考下这个帖子:http://topic.csdn.net/u/20101102/12/aa9a6814-d2e3-4d76-ad25-562569d88bc2.html
    感觉你的xml文档有问题呢?
      

  2.   

    用了樓主的代碼試了一下,遇到以下問題,可能對樓主有所幫助
    1. 存儲過程中的變量最好不要跟表的字段名一樣
    2. 可以這樣調用
    begin
    addperson('path/test.xml','path/test.log');
    end;
    3. xml必須符合規範(如,測試環境不能處理中文)經過多番修改,我可以insert進去
      

  3.   


    begin
    addperson('path/test.xml','path/test.log');
    end;这样调用可是往oracle数据库中添加数据吗?xml必須符合規範(如,測試環境不能處理中文)
    测试环境不能处理中文 是指?本人是初学者,很菜!! 谢谢诶各位大大能帮忙!!!
      

  4.   

    楼主,我感觉你是看了javaeye论坛上的一个帖子才做的这个,所以我觉得你解决问题的办法是完全按照原帖的东西做,xml文件,程序,数据表,看看可以成功不,如果成功了,就知道你的问题是出在中文的问题上了,因为原帖是没有中文的。
    你是在学习xml解析,并不一定要钻牛角尖一定要解决你现在做的问题,还有,我要提醒你,不管写什么程序,中文能省就省。
      

  5.   

    begin
    addperson('path/test.xml','path/test.log');
    end;
    這樣可以在plsql的一個命令窗口中調用存儲過程addperson,而call addperson(...)可以在sqlplus的命令窗口中調用存儲過程。测试环境不能处理中文 是指?
    這個是指在我這邊的系統是英文的,不支持中文,所以你的xml文件很多中文會變成?或亂碼。
      

  6.   

    你把你建的表的default ‘’not null 去掉了试试
      

  7.   

    已经去掉! xml中的数据还是没有添加到oracle表中!!!
      

  8.   

    tmp VARCHAR2(100);        --(3)申明变量tmp
    改成tmp integer;
      

  9.   

    用 xmltype 类型和 xmltable 函数处理就可以。-- 创建目录
    create directory vdir as '/home/oracle/dump';
    grant read on directory vdir to scott;-- 查询(由于是 E 版,只能使用 utf8 的 x.xml 文件测试)
    with t as (
    select xmltype(bfilename('VDIR','x.xml'),nls_charset_id('UTF8')) x from dual
    )
    select xc.*
    from t, xmltable('/TRS/REC'
     passing x
     columns "作者" varchar2(20) path '作者',
             "修改日期" char(10) path '修改日期',
             "分类" varchar2(30) path '分类',
             "发表日期" char(10) path '发表日期',
             "字数" number(4) path '字数',
             "录入员" varchar2(20) path '录入员',
             "录入日期" char(10) path '录入日期',
             "日期" char(10) path '日期',
             "来源" varchar2(30) path '来源',
             "标题" varchar2(20) path '标题',
             "正文" varchar2(4000) path '正文',
             "正文字数" number(4) path '正文字数',
             "状态" varchar(10) path '状态') xc
    /
      

  10.   

    如果是 GBK 的,就用下面的SQL> create directory vdir as 'c:\xml';Directory created.SQL> ed
      1  with t as (
      2  select xmltype(bfilename('VDIR','x.xml'),nls_charset_id('ZHS16GBK')) x from dual
      3  )
      4  select xc.*
      5  from t, xmltable('/TRS/REC'
      6   passing x
      7   columns "作者" varchar2(20) path '作者',
      8           "修改日期" char(10) path '修改日期',
      9           "分类" varchar2(30) path '分类',
     10           "发表日期" char(10) path '发表日期',
     11           "字数" number(4) path '字数',
     12           "录入员" varchar2(20) path '录入员',
     13           "录入日期" char(10) path '录入日期',
     14           "日期" char(10) path '日期',
     15           "来源" varchar2(30) path '来源',
     16           "标题" varchar2(20) path '标题',
     17           "正文" varchar2(4000) path '正文',
     18           "正文字数" number(4) path '正文字数',
     19*          "状态" varchar(10) path '状态') xc
      

  11.   

       "状态" varchar(10) path '状态') xc
      

  12.   

    提示如下错误!!!
    ORA-22288: 文件或 LOB 操作FILEOPEN失败
    ????????????????
    ORA-06512: 在 "SYS.DBMS_LOB", line 523
    ORA-06512: 在 "SYS.XMLTYPE", line 287
    ORA-06512: 在 line 1
      

  13.   

    找到解决方法了!!create directory "vdir" as 'c:\xml';
    --vdir加上""号!!
    谢谢xman_78tom,也谢谢gelyon和
    nGX20080110
    结贴了!!!