eygle.com   eygle.com
eygle.com  
 

« 获评51CTO 2008年度 最佳原创作者奖 | Blog首页 | 分区表的维护 - ORA-14402 更新分区关键字列 »

xmldom.setCharset无效问题的解决

作者:eygle |【转载时请以超链接形式标明文章和作者信息及本声明
链接:
有朋友问到关于XMLDOM无法正确设置字符集的问题,也就是xmldom.setCharset无效的问题。
查询一下Metalink,参考Note:251011.1,这是Oracle的一个Bug,可以通过dbms_output来绕过这个问题。

在Oracle Databsae 10g中测试:
SQL> select * from v$version
  2  /

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Prod
PL/SQL Release 10.2.0.2.0 - Production
CORE    10.2.0.2.0      Production
TNS for Linux: Version 10.2.0.2.0 - Production
NLSRTL Version 10.2.0.2.0 - Production

效果如下,这是一个普遍性问题,在9i、10g中都存在:
SQL> create or replace procedure test_SETCHARSET
  2  is
  3  doc xmldom.DOMDocument;
  4  main_node xmldom.DOMNode;
  5  root_node xmldom.DOMNode;
  6 
  7  item_node xmldom.DOMNode;
  8  root_elmt xmldom.DOMElement;
  9  item_elmt xmldom.DOMElement;
10  item_text xmldom.DOMText;
11 
12 
13 
14  buffer_problem          varchar2(2000); 
15  buffer_root_node      varchar2(2000);
16  buffer_doc_header      varchar2(80);
17  buffer_doc            varchar2(2000);
18  reqRootNode xmldom.DOMNode; 
19 
20  BEGIN
21  --
22  -- the problem : 
23  --
24  dbms_output.put_line('=========== ');
25  dbms_output.put_line(' PROBLEM: setCharSet ISO-8859-1 has no effect' );
26 
27  doc := xmldom.newDOMDocument;
28  main_node := xmldom.makeNode(doc);
29  xmldom.setversion(doc,'1.0');
30  xmldom.setCharset(doc,'ISO-8859-1');
31  root_elmt := xmldom.createElement(doc, 'A');
32  root_node := xmldom.appendChild( main_node, xmldom.makeNode(root_elmt));
33 
34  item_elmt := xmldom.createElement(doc, 'B');
35  item_node := xmldom.appendChild(root_node, xmldom.makeNode(item_elmt));
36  -- chr (192) :    LATIN CAPITAL LETTER A WITH GRAVE in  ISO-8859-1
37  item_text := xmldom.createTextNode(doc, 'X' ||chr (192) ||'X');
38  item_node := xmldom.appendChild(item_node, xmldom.makeNode(item_text));
39 
40  xmldom.writetobuffer(doc, buffer_problem);
41  -- the final document here is encoded in UTF8
42  dbms_output.put_line(buffer_problem);
43  dbms_output.put_line(' ');
44  dbms_output.put_line('=========== ');
45 
46  --
47  -- workaround
48  --
49 
50  dbms_output.put_line(' WORKAROUND:' );
51  dbms_output.put_line(' '); 
52    buffer_doc_header := '<?xml version="1.0" encoding="ISO-8859-1"?>';
53    reqRootNode := xmldom.makeNode (xmldom.getDocumentElement(doc));
54   
55    xmldom.writetobuffer(reqRootNode, buffer_root_node);
56    buffer_root_node := convert (buffer_root_node,'WE8ISO8859P1','UTF8');
57    buffer_doc :=  buffer_doc_header || buffer_root_node;
58   
59  dbms_output.put_line(buffer_doc );
60  dbms_output.put_line('=========== ');
61  --
62 
63  xmldom.freeDocument(doc);
64 
65  END;
66  /

Procedure created.

SQL> set serveroutput on
SQL> exec test_setcharset
===========
PROBLEM: setCharSet ISO-8859-1 has no effect
<?xml version="1.0"?>
<A>
  <B>XX</B>
</A>


===========
WORKAROUND:
<?xml version="1.0" encoding="ISO-8859-1"?><A>
  <B>XX</B>
</A>


===========

PL/SQL procedure successfully completed.

测试用例来自Metalink,供参考!


历史上的今天...
      >> 2008-01-14文章:
             中国IT技术精英年会纪事之一
      >> 2007-01-14文章:
             2006 中国ERP市场谁主沉浮?
      >> 2006-01-14文章:
      >> 2005-01-14文章:
             HRAY纳斯达克的IPO历程
             今天参加的Oracle Technology Day
------
这篇 【xmldom.setCharset无效问题的解决】来自 eygle.com | CSDN网摘| del.icio.us|Google订阅 | 鲜果订阅 | 抓虾订阅

By eygle on 2009-01-14 22:18 | Comments (0) | Posted to Advanced | Edit |

相关文章 随机文章
  • dbms_system.ksdwrt:向告警日志文件写指定信息
  • 10g临时表空间组导致递归SQL高度解析案例
  • 见过这么高并发( logons current)的数据库么?
  • ORA-02097 标准版里Resource Manager的Bug
  • 遭遇 ORA-7445 kkofkrproratestat 错误
  • IMP-00093 Inconsistency dumpfile之问题解决
    恩墨科技为某企业SAP数据库提供紧急援助服务
    阵列增加硬盘导致IO错误一例
    Oracle经典图书之-Optimizing Oracle Performance
    何去何从 - 关于DBA前途问题的探讨
    搜索本站:

    留言 (0)

    发表留言:



    Remember Me?
    (输入验证码后方可评论,谢谢支持)



    CopyRight © 2004~2010 eygle.com, All rights reserved.