<?xml version="1.0"?>
<PEOPLE>
    <PERSON PERSONID="E01">
        <NAME>Tony Blair</NAME>
        <ADDRESS>10 Downing Street, London, UK</ADDRESS>
        <TEL>(061) 98765</TEL><FAX>(061) 98768</FAX>
        <EMAIL>[email protected]</EMAIL>
    </PERSON>
    <PERSON PERSONID="E02">
        <NAME>Bill Clinton</NAME>
        <ADDRESS>White House, USA</ADDRESS>
        <TEL>(001) 6400 98765</TEL><FAX>(001) 6400 98769</FAX>
        <EMAIL>[email protected]</EMAIL>
    </PERSON>
    <PERSON PERSONID="E03">
        <NAME>Tom Cruise</NAME>
        <ADDRESS>57 Jumbo Street, New York, USA</ADDRESS>
        <TEL>(001) 4500 67859</TEL><FAX>(001) 4500 67895</FAX>
        <EMAIL>[email protected]</EMAIL>
    </PERSON>
    <PERSON PERSONID="E04">
        <NAME>Linda Goodman</NAME>
        <ADDRESS>78 Crax Lane, London, UK</ADDRESS>
        <TEL>(061) 54 56789</TEL><FAX>(061) 54 56772</FAX>
        <EMAIL>[email protected]</EMAIL>
    </PERSON>
</PEOPLE>于是写出过程如下:
--建表
CREATE TABLE PEOPLE
(
   PERSONID VARCHAR2(10) PRIMARY KEY,
   NAME VARCHAR2(20),
   ADDRESS VARCHAR2(60),
   TEL  VARCHAR2(20),
   FAX  VARCHAR2(20),
   EMAIL VARCHAR2(40)
);--从xml文件载入数据保存到数据库的过程 
create or replace procedure xml2db(xmlfile varchar2) as
  p xmlparser.Parser;
  doc xmldom.DOMDocument;
  n xmldom.DOMNode;
  nl xmldom.DOMNodeList;
  len number;
  --根据PERSON结点生成插入SQL语句的过程 
  function insertsql(node xmldom.DOMNode) return varchar2
  is
    n xmldom.DOMNode;
    nl xmldom.DOMNodeList;
    len number;
    nnm xmldom.DOMNamedNodeMap;
    isql varchar2(200);
  begin
    --取得PERSON结点所有属性 
    nnm := xmldom.getAttributes(node);
    isql := 'insert into people values(';
    isql := isql || '''';
    --取得所有属性中的第一个属性,即"PERSONID",并拼接到SQL语句中 
    isql := isql || xmldom.getNodeValue(xmldom.item(nnm,0));
    isql := isql || '''';
    --取得PERSON结点下的所有结点,准备遍历 
    nl := xmldom.getChildNodes(node);
    len := xmldom.getLength(nl);
    for i in 0..len-1 loop
      --取出第i个结点 
      n := xmldom.item(nl,i);
      isql := isql || ',';
      isql := isql || '''';
      --将结点的文本值取出并拼接到SQL语句中
      isql := isql || xmldom.getNodeValue(xmldom.getFirstChild(n));
      isql := isql || '''';
    end loop;
    isql := isql || ')';
    return isql;
  end insertsql;
begin
  p := xmlparser.newParser;
  xmlparser.parse(p,xmlfile);
  --转换xml文件成DOM对像 
  doc := xmlparser.getDocument(p);
  xmlparser.freeParser(p);
  --取出所有PERSON元素 
  nl := xmldom.getElementsByTagName(doc,'PERSON');
  len := xmldom.getLength(nl);
  --清空people表的内容 
  delete from people;
  for i in 0..len-1 loop
    --取出第i个PERSON元素 
    n := xmldom.item(nl,i);
    --执行插入该PERSON元素所用的SQL语句 
    execute immediate insertsql(n);
  end loop;
  commit;
  xmldom.freeDocument(doc);
end xml2db;
/此程序能通过编译,,,但却在运行的时候出现以下错误:
ORA-31001: 资源句柄或路径名 "c:/people.xml" 无效
ORA-06512: 在 "SYS.XDBURITYPE", line 11
ORA-06512: 在 "XDB.DBMS_XSLPROCESSOR", line 142
ORA-29280: 目录路径无效
ORA-29280: 目录路径无效
ORA-29280: 目录路径无效
ORA-06512: 在 "XDB.DBMS_XMLPARSER", line 119
ORA-06512: 在 "SYSTEM.XML2DB", line 40
ORA-06512: 在 line 2
xml文件是放在c盘根目录下的,,,,麻烦大家帮我看看,,,谢谢了,,,小弟是初学者,,望多指教!!!再次谢谢

解决方案 »

  1.   

    大家帮帮忙啊,,,这个东西比较急,,,知道的xdjm麻烦请教了,,,,谢谢
      

  2.   

    c:/people.xml--> c:\people.xml这样如何,
      

  3.   

    xml文件能在浏览器中读出 ,,,程序也能通过编译,,,就是不能执行 运行的时候出现以下错误: 
    ORA-31001: 资源句柄或路径名 "c:/people.xml" 无效 
    ORA-06512: 在 "SYS.XDBURITYPE", line 11 
    ORA-06512: 在 "XDB.DBMS_XSLPROCESSOR", line 142 
    ORA-29280: 目录路径无效 
    ORA-29280: 目录路径无效 
    ORA-29280: 目录路径无效 
    ORA-06512: 在 "XDB.DBMS_XMLPARSER", line 119 
    ORA-06512: 在 "SYSTEM.XML2DB", line 40 
    ORA-06512: 在 line 2 
      

  4.   

    ORA-31001: 资源句柄或路径名 "c:/people.xml" 无效 检查你调用的地方,不能直接用c:/people.xml这样的路径访问。要先创建directory,然后给dirctory附上权限。SQL> create or replace directory log_dir as 'e:/log';
    目录已创建。SQL> grant read, write on directory log_dir to test1;
    授权成功。用这样的方式来调用
    file:=utl_file.fopen('LOG_DIR','log.txt','w');