关于解析XML文档的问题

羽佳0627 2006-08-07 11:18:49
我的procedure:
create or replace procedure domsample(dir varchar2, inpfile varchar2,
errfile varchar2) is
-- 参数说明:
-- dir 基本目录,如 'd:\xml\plsql'
-- inpfile 输入文件名,不含路径,如 'student.xml'
-- errfile 错误日志文件,保存解析错误信息, 如 'err.log'

p xmlparser.parser;
doc xmldom.DOMDocument;

-- 打印文档中的元素及元素的文本信息
procedure printElements(doc xmldom.DOMDocument) is
nl xmldom.DOMNodeList;
len number;
n xmldom.DOMNode;

begin
-- 获取所有元素
nl := xmldom.getElementsByTagName(doc, '*'); -- * 表示所有元素,包括根元素
len := xmldom.getLength(nl);

-- 遍历所有元素
for i in 0..len-1 loop
n := xmldom.item(nl, i);
dbms_output.put_line(xmldom.getNodeName(n) || ':'
|| xmldom.getNodeValue(xmldom.getFirstChild(n)));
end loop;

dbms_output.put_line(''); -- 打印空行
end printElements;

-- 打印文档中每个元素的属性
procedure printElementAttributes(doc xmldom.DOMDocument) is
nl xmldom.DOMNodeList;
len1 number;
len2 number;
n xmldom.DOMNode;
e xmldom.DOMElement;
nnm xmldom.DOMNamedNodeMap;
attrname varchar2(100);
attrval varchar2(100);

begin

-- 获取所有元素
nl := xmldom.getElementsByTagName(doc, '*'); -- * 表示所有元素,包括根元素
len1 := xmldom.getLength(nl);

-- 遍历所有元素
for j in 0..len1-1 loop
n := xmldom.item(nl, j);
e := xmldom.makeElement(n);
dbms_output.put_line(xmldom.getTagName(e) || '!');

-- 获取元素的所有属性
nnm := xmldom.getAttributes(n);

if (xmldom.isNull(nnm) = FALSE) then -- 如果有属性
len2 := xmldom.getLength(nnm);

-- 遍历所有属性
for i in 0..len2-1 loop
n := xmldom.item(nnm, i);
attrname := xmldom.getNodeName(n);
attrval := xmldom.getNodeValue(n);
dbms_output.put_line(' ' || attrname || ' = ' || attrval);
end loop;
dbms_output.put_line('');
end if;
end loop;

end printElementAttributes;

begin
-- 新建解析器实例
p := xmlparser.newParser;

-- 设置解析器特性
xmlparser.setValidationMode(p, TRUE); -- 是否使用文档指定的DTD验证文档合法性
--xmlparser.setErrorLog(p, dir || '\' || errfile); -- 设置错误日志文件
xmlparser.setBaseDir(p, dir); -- 设置基本目录

-- 解析输入的xml文件
xmlparser.parse(p, dir || '\\' || inpfile);

-- 获取解析后的文档对象
doc := xmlparser.getDocument(p);

-- 释放解析器实例
xmlparser.freeParser(p);

-- 打印文档元素
dbms_output.put('文档元素: ');
printElements(doc);

-- 打印文档元素属性
dbms_output.put_line('每个元素的属性: ');
printElementAttributes(doc);

-- 释放文档对象
xmldom.freeDocument(doc);

-- 处理异常
exception
when xmldom.INDEX_SIZE_ERR then
raise_application_error(-20120, 'Index Size error');
when xmldom.DOMSTRING_SIZE_ERR then
raise_application_error(-20120, 'String Size error');
when xmldom.HIERARCHY_REQUEST_ERR then
raise_application_error(-20120, 'Hierarchy request error');
when xmldom.WRONG_DOCUMENT_ERR then
raise_application_error(-20120, 'Wrong doc error');
when xmldom.INVALID_CHARACTER_ERR then
raise_application_error(-20120, 'Invalid Char error');
when xmldom.NO_DATA_ALLOWED_ERR then
raise_application_error(-20120, 'Nod data allowed error');
when xmldom.NO_MODIFICATION_ALLOWED_ERR then
raise_application_error(-20120, 'No mod allowed error');
when xmldom.NOT_FOUND_ERR then
raise_application_error(-20120, 'Not found error');
when xmldom.NOT_SUPPORTED_ERR then
raise_application_error(-20120, 'Not supported error');
when xmldom.INUSE_ATTRIBUTE_ERR then
raise_application_error(-20120, 'In use attr error');
end domsample;
****************************************************************************************
在E:\XML+Oracle路径下有people.xml、err.log,err.log是空的文本文件,people.xml如下:
<?xml version="1.0" encoding="GB2312"?>
<PEOPLE>
<PERSON PERSONID="E01">
<NAME>Tony Blair</NAME>
<ADDRESS>10 Downing Street, London, UK</ADDRESS>
<TEL>(061) 98765</TEL>
<FAX>(061) 98768</FAX>
<EMAIL>blair@everywhere.com</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>bill@everywhere.com</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>cruise@everywhere.com</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>linda@everywhere.com</EMAIL>
</PERSON>
</PEOPLE>
************************************************************************************
执行procedure:
begin
domsample('E:\Exercise\PRJ\XML+Oracle', 'people.xml', 'err.log');
end;
**************************************************************************************
报错:
SQL> begin
2 domsample('E:\Exercise\PRJ\XML+Oracle', 'people.xml', 'err.log');
3 end;
4 /
begin
*
第 1 行出现错误:
ORA-31001: 资源句柄或路径名 "E:\Exercise\PRJ\XML+Oracle\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: 在 "LW.DOMSAMPLE", line 84
ORA-06512: 在 line 2
**********************************************************************************
不解:“E:\Exercise\PRJ\XML+Oracle\people.xml”这个路径明明是对的,为什么Oracle无法识别
是不是要设置一下Oracle的系统配置
...全文
1099 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
码头地盘 2006-11-23
  • 打赏
  • 举报
回复
laogong007(老公)

给我也发份把,我也是青鸟的l.y188@163.com
羽佳0627 2006-11-22
  • 打赏
  • 举报
回复
laogong007(老公) ( ) 信誉:99 Blog 2006-8-17 18:21:11 得分: 0
这题是北大青鸟的一个项目案例。如果你是南开中心的,找我。呵呵~~ 我是宫老师。这题作的时候是有问题,我经过反复应用,找到原因了。

************************************************
我是北大青鸟的,但是恐怕和宫老师不是一个地方的,可否把解决的办法发给我。
邮箱:liaowei-0627@163.com
laogong007 2006-08-17
  • 打赏
  • 举报
回复
我的错误是:
ORA-20100: Error occurred while parsing: No such file or directory
ORA-06512: 在"SYS.XMLPARSER", line 22
ORA-06512: 在"SYS.XMLPARSER", line 79
ORA-06512: 在"SCOTT.DOMSAMPLE", line 84
ORA-06512: 在line 1
和你的一样吧,哈哈~~ 已经解决了
laogong007 2006-08-17
  • 打赏
  • 举报
回复
这题是北大青鸟的一个项目案例。如果你是南开中心的,找我。呵呵~~ 我是宫老师。这题作的时候是有问题,我经过反复应用,找到原因了。
羽佳0627 2006-08-11
  • 打赏
  • 举报
回复
摆脱,帮帮忙
羽佳0627 2006-08-09
  • 打赏
  • 举报
回复
Oh my God!
怎么没人理我?!!!!!!!!!
好受打击!呜呜呜……
AFIC 2006-08-09
  • 打赏
  • 举报
回复
他说的不支持应该是只能传入变量
dir || '\' || errfile先付给另一个变量q
xmlparser.setErrorLog(p, q);
应该可以吧。我觉得你还是多输出你实际调用的时候的路径,
有时候oracle会帮你加空格的……
羽佳0627 2006-08-09
  • 打赏
  • 举报
回复
照楼上的办法还是不行,
另外我把这一行:
--xmlparser.setErrorLog(p, dir || '\' || errfile); -- 设置错误日志文件
前面的那个“--”去掉,
再执行:
begin
domsample('E:\Exercise\PRJ\XML_Oracle', 'student.xml', 'err.log');
end;
就报这个错:
begin
*
第 1 行出现错误:
ORA-31020: 不允许执行此操作, 原因: Not supported
ORA-06512: 在 "XDB.DBMS_XMLPARSER", line 395
ORA-06512: 在 "LW.DOMSAMPLE", line 80
ORA-06512: 在 line 2
我的是10g的数据库,不支持,不可能吧。
可以用过程自己创建XML格式的文档,但无法保存为文件,可是没有报错。
如果要解析已存在的XML格式文件就不行,不知道为什么。
我的系统是Windows Server 2003,数据库是Oracle10g2。
AFIC 2006-08-09
  • 打赏
  • 举报
回复
没法设置,XML+Oracle改成XML_Oracle试试
羽佳0627 2006-08-09
  • 打赏
  • 举报
回复
还是不行,错误依旧

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧