暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

xmldom.setCharset无效问题的解决

原创 eygle 2009-01-12
655
有朋友问到关于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,供参考!



「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论