- 论坛徽章:
- 0
|
本帖最后由 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?
谢谢!
- #!/usr/bin/perl
- use Encode;
- use utf8;
- binmode $_, ":utf8" for qw/STDOUT STDIN STDERR/;
- use XML::DOM;
- use XML::LibXML;
- use XML::Twig;
- # 创建XML的最外层元素
- my $xml = "<root/>";
- my $parser = new XML::DOM::Parser;
- my $dom = $parser->parse($xml);
- # 生成Sent节点
- my $Sent = $dom->createElement("句");
- # 设置节点属性
- $Sent->setAttribute("txt", "我们爱祖国");
- # 生成part节点
- my $part1 = $dom->createElement("主");
- $part1->setAttribute("attr", "1");
- # 生成一个文本节点
- my $text = $dom->createTextNode("我们");
- $part1->appendChild($text);
- # 生成part节点
- my $part2 = $dom->createElement("谓");
- $part2->setAttribute("attr", "2");
- # 生成一个文本节点
- my $text2= $dom->createTextNode("爱祖国");
- $part2->appendChild($text2);
- # 添加part到Sent
- $Sent->appendChild($part1);
- $Sent->appendChild($part2);
- # 添加Sent到XML文档
- $dom->getDocumentElement->appendChild($Sent);
- print $dom->toString; #正确,无乱码
- my $twig = new XML::Twig;
- $twig->set_indent(" "x4);
- $twig->parse($dom->toString);
- $twig->set_pretty_print("indented");
- print $twig->sprint;# 输出,此处无乱码
- #由于不了解如何直接用XML::LibXML直接生成 xml,故以上采用网上代码用XML::DOM生成xml
- #由于不了解XML::DOM用增加新节点 ,#下面利用XML::LibXML 增加新节点
- my $parser2 = XML::LibXML->new;
- #$parser2->setEncoding("UTF8");
- my $temxml = $dom->toString;
- my $doc = $parser2->parse_string($temxml);
- my $root = $doc->documentElement();
- sub addPart2($)#增加一个句子成分 文本直接包含
- {
- my ($father,$nowpart, $txt, $attr) = @_;
- my $part = $father->addNewChild('', $nowpart);#$nowpart = 主 谓 宾
- $part->addChild( $doc->createTextNode($txt) );#???
- $part->setAttribute("attr", "3");
- }
- my @junode = $root->getElementsByTagName('句');
- foreach my $junow(@junode)
- {
- if($junow->nodeName() eq "句") {
-
- if($junow->hasAttributes()) {
- print $junow->nodeName() . ": " . $junow->textContent;
- print " " . $junow->attributes->item(0)->value();
- print "\n";
- } else {
- print $junow->nodeName() . ": " . $values->textContent;
- print "\n";
- }
- addPart2($junow,'补', '很深', 'not');#
- }
- }
- print "-------\n"; #
- print $doc->toString(1); #错误,出现乱码
- # 利用XML::Twig整理格式,正确,无乱码
- my $twig2 = new XML::Twig;
- $twig2->set_indent(" "x4);
- $twig2->parse($doc->toString);
- $twig2->set_pretty_print("indented");
- print $twig2->sprint;
复制代码 |
|