待解析的XML 
<?xml version="1.0"?>  
<PEOPLE>  
      <PERSON PERSONID="E01">  
          <NAME>Tony Blair  </NAME>  
          <ADDRESS>10 Downing Street, London, UK  </ADDRESS>  
      </PERSON>  
</PEOPLE>  

存储过程如下  create or replace procedure SP_0001_ParsePERSON2( v_wjm       IN varchar2, /*文件名*/ 
                                                v_log       IN varchar2, /*日志文件名*/ 
                                                PReturnCode OUT varchar2, /*S-成功、E-失败*/ 
                                                PReturnMsg  OUT varchar2 ) As 
  /******* 定义初始化变量***************/ 
  EXCP_NOFILEDIR exception;  
  EXCP_NOFILENAME exception;  
  v_count    NUMBER;  
  xmlPar     XMLPARSER.parser := XMLPARSER.NEWPARSER; 
  doc        xmldom.DOMDocument; 
  len        integer; 
  rootNodes  xmldom.DOMNodeList; 
  chilNodes  xmldom.DOMNodeList; 
  tempNode   xmldom.DOMNode; 
  tempArrMap xmldom.DOMNamedNodeMap;   v_FileDir  VARCHAR(100); /* 文件路径 */ 
  v_fileName VARCHAR(100); /* 文件路径 */ 
  v_fileLog  VARCHAR(100); /* 文件路径 */   pid     varchar2(4); 
  name    varchar2(50); 
  address varchar2(200); BEGIN   xmlPar := xmlparser.newParser; 
  xmlparser.setErrorLog(xmlPar, v_log); 
  xmlparser.parse(xmlPar, v_wjm);   doc := xmlparser.getDocument(xmlPar); 
  --释放解析器 
  xmlparser.freeParser(xmlPar); 
  --取得根目录 
  rootNodes := xmldom.getElementsByTagName(doc, 'PERSON'); 
  len       := xmldom.getLength(rootNodes); 
  --遍历根节点 
  for i in 0 .. len - 1 loop 
    tempNode   := xmldom.item(rootNodes, i); 
    tempArrMap := xmldom.getAttributes(tempNode); 
    pid        := xmldom.getNodeValue(xmldom.getNamedItem(tempArrMap,'PERSON')); 
    chilNodes  := xmldom.getChildNodes(tempNode); 
    tmp        := xmldom.getLength(chilNodes); 
    name       := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item(chilNodes,0))); 
    address    := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item(chilNodes,1))); 
    INSERT INTO PEOPLE VALUES (pid, name, address); 
  end loop; 
  commit; 
  --释放文档对象 
  xmldom.freeDocument(doc); 
  PReturnCode := 'S'; 
exception 
end SP_0001_ParsePERSON; 
调试到这里时  xmlparser.setErrorLog(xmlPar,  'C:\datafile\xmllog.txt');  
报ORA-31020: The operation is not allowed, Reason: Not supported  
注释上一句,执行这句时 xmlparser.parse(xmlPar, 'C:\datafile\person.xml');  
又报ORA-29280: invalid directory path  不知道是哪里出的问题,用的DBA的权限调试也报错。 试了很多次就是不行。。帮忙看下 
参考http://www.oracle-base.com/articles/8i/ParseXMLDocuments8i.php说先要安装xdk,我用的是oracle10g的数据库,不知道要不要安装xdk 
但是执行到xmlPar := xmlparser.newParser;是没错的 

解决方案 »

  1.   

    oracle里面好像不能直接使用本地路径,你要先定义一个Directory,然后再存储过程里使用这个Directory才可以。
      

  2.   

    在服务器上还是在客户端呢?
    感觉应该是你的服务器上没有 'C:\datafile\xmllog.txt'文件造成的。
      

  3.   

    1楼的意思说应该用Directory再加上文件名,是吗?
    xmlparser.parse(xmlPar, v_wjm);  
    这个是这个函数的定义,里面说了用url/file,我也不知道哪里错了
    /**
     * Parses xml stored in the given url/file and returns the built DOM Document
     */
    FUNCTION parse(url VARCHAR2) RETURN dbms_xmldom.DOMDocument;
    2楼我在服务器上用这个也不好使
    不知道怎么解决