免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2923 | 回复: 2

xml 用print $doc->toString(1)出现乱码 [复制链接]

论坛徽章:
0
发表于 2017-07-23 17:19 |显示全部楼层
本帖最后由 hztj2005 于 2017-07-23 17:20 编辑

代码保存为utf8格式,windows下,代码页设为utf8,即chcp 65001,可以运行以下代码,但有两个问题:
1、代码中有两处$doc->toString,第2处出现乱码,请教如何解决?
2、由于不了解如何直接用XML::LibXML直接生成 xml,不是从文件或句柄中读入xml,故以上采用网上代码用XML::DOM生成xml,请教如何直接用XML::LibXML直接生成 xml?
谢谢!

  1. #!/usr/bin/perl
  2. use Encode;
  3. use utf8;
  4. binmode $_, ":utf8" for qw/STDOUT STDIN STDERR/;
  5. use XML::DOM;
  6. use XML::LibXML;
  7. use XML::Twig;

  8. # 创建XML的最外层元素
  9. my $xml = "<root/>";

  10. my $parser = new XML::DOM::Parser;
  11. my $dom = $parser->parse($xml);

  12. # 生成Sent节点
  13. my $Sent = $dom->createElement("句");
  14. # 设置节点属性
  15. $Sent->setAttribute("txt", "我们爱祖国");


  16. # 生成part节点
  17. my $part1 = $dom->createElement("主");
  18. $part1->setAttribute("attr", "1");
  19. # 生成一个文本节点
  20. my $text = $dom->createTextNode("我们");
  21. $part1->appendChild($text);

  22. # 生成part节点
  23. my $part2 = $dom->createElement("谓");
  24. $part2->setAttribute("attr", "2");
  25. # 生成一个文本节点
  26. my $text2= $dom->createTextNode("爱祖国");
  27. $part2->appendChild($text2);

  28. # 添加part到Sent
  29. $Sent->appendChild($part1);
  30. $Sent->appendChild($part2);

  31. # 添加Sent到XML文档
  32. $dom->getDocumentElement->appendChild($Sent);

  33. print $dom->toString; #正确,无乱码

  34. my $twig = new XML::Twig;
  35. $twig->set_indent(" "x4);
  36. $twig->parse($dom->toString);
  37. $twig->set_pretty_print("indented");
  38. print $twig->sprint;# 输出,此处无乱码

  39. #由于不了解如何直接用XML::LibXML直接生成 xml,故以上采用网上代码用XML::DOM生成xml

  40. #由于不了解XML::DOM用增加新节点 ,#下面利用XML::LibXML 增加新节点
  41. my $parser2 = XML::LibXML->new;
  42. #$parser2->setEncoding("UTF8");
  43. my $temxml = $dom->toString;
  44. my $doc = $parser2->parse_string($temxml);
  45. my $root = $doc->documentElement();

  46. sub addPart2($)#增加一个句子成分 文本直接包含
  47. {
  48. my ($father,$nowpart, $txt, $attr) = @_;
  49. my $part = $father->addNewChild('', $nowpart);#$nowpart = 主 谓 宾
  50. $part->addChild( $doc->createTextNode($txt) );#???
  51. $part->setAttribute("attr", "3");

  52. }


  53. my @junode = $root->getElementsByTagName('句');
  54. foreach my $junow(@junode)
  55. {
  56.         if($junow->nodeName() eq "句") {
  57.            
  58.       if($junow->hasAttributes()) {
  59.         print $junow->nodeName() . ": " .  $junow->textContent;
  60.         print " " . $junow->attributes->item(0)->value();
  61.         print "\n";
  62.       } else {
  63.         print $junow->nodeName() . ": " .  $values->textContent;
  64.         print "\n";
  65.       }        
  66.       addPart2($junow,'补', '很深', 'not');#
  67.   }
  68. }

  69. print "-------\n"; #
  70. print $doc->toString(1); #错误,出现乱码


  71. # 利用XML::Twig整理格式,正确,无乱码
  72. my $twig2 = new XML::Twig;
  73. $twig2->set_indent(" "x4);
  74. $twig2->parse($doc->toString);
  75. $twig2->set_pretty_print("indented");
  76. print $twig2->sprint;
复制代码

论坛徽章:
0
发表于 2017-07-23 20:43 |显示全部楼层
这里有类似的问题:
https://stackoverflow.com/questi ... tly-using-xmllibxml
How to print UTF-8 correctly using XML::LibXML

论坛徽章:
0
发表于 2017-07-23 20:47 |显示全部楼层
本帖最后由 hztj2005 于 2017-07-23 20:48 编辑

1楼的原因没有弄明白,但直接用XML::LibXML::Document把问题解决了。

  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use utf8;
  5. use XML::LibXML qw( );
  6. my $dom = XML::LibXML::Document->new(1.0, "UTF-8");

  7. my $root = $dom->createElement("root");
  8. #$root->appendText("abc");#
  9. $dom->setDocumentElement($root);

  10. # 生成Sent节点
  11. my $Sent = $dom->createElement("句");
  12. $Sent->setAttribute("txt", "我们爱祖国");# 设置节点属性


  13. # 生成part节点
  14. my $part1 = $dom->createElement("主");
  15. $part1->setAttribute("attr", "1");
  16. my $text = $dom->createTextNode("我们");# 生成一个文本节点
  17. $part1->appendChild($text);

  18. # 生成part节点
  19. my $part2 = $dom->createElement("谓");
  20. $part2->setAttribute("attr", "2");
  21. my $text2= $dom->createTextNode("爱祖国");# 生成一个文本节点
  22. $part2->appendChild($text2);

  23. # 添加part到Sent
  24. $Sent->appendChild($part1);
  25. $Sent->appendChild($part2);

  26. # 添加Sent到XML文档
  27. $dom->getDocumentElement->appendChild($Sent);

  28. print $dom->toString(1); #正确

  29. sub addPart2($)#增加一个句子成分
  30. {
  31. my ($father,$nowpart, $txt, $attr) = @_;
  32. my $part = $father->addNewChild('', $nowpart);#$nowpart = 主 谓 宾
  33. $part->addChild( $dom->createTextNode($txt) );#???
  34. $part->setAttribute("attr", "3");

  35. }


  36. my @junode = $root->getElementsByTagName('句');
  37. foreach my $junow(@junode)
  38. {
  39.         if($junow->nodeName() eq "句")
  40.         {   
  41.       addPart2($junow,'补', '很深', 'not');#
  42.   }
  43. }

  44. print "-------\n"; #
  45. print $dom->toString(1); #
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP