不要在XML :: LibXML中干扰编码的entites(宽字符)

时间:2016-07-29 05:46:46

标签: perl perl-module

我正在尝试使用XML:LibXML向现有XML节点添加其他属性,当我尝试实现此目的时,所有编码实体(如&dagger¶都将转换为纯UTF-8字符。如何避免这种转换并保留原始编码?

XML:

     <?xml version="1.0"?>
     <!DOCTYPE test SYSTEM "test.dtd">
     <test>
     <name>
          <firstName>firstname&Dagger;</firstName>
         <lastName>last name</lastName>
     </name>
     <name>
        <firstName>first name</firstName>
        <lastName>last name</lastName>
    </name>
  </test>

代码:

  use strict;
  use warnings;
  use XML::LibXML;
  my $parser = new XML::LibXML;
  $parser->validation(1);
  $parser->load_ext_dtd(1);
  my $doc  = $parser->parse_file($instance);
  foreach my $new ($doc->findnodes('test'))
   {
    my($name) = $new->findnodes('//firstName');
    print $name."\n";
   }

我收到带有转换编码的输出<firstName>firstname‡</firstName>以及警告Wide character in print at perlfile.pl

如果我使用encode print encode_entities($ name)。“\ n”;在use HTML::Entities;的帮助下,我可以获得编码实体但我不想使用它,因为我可能在文本中得到一个utf-8字符而不是实体。所以我想保留输出中的文本。有没有办法做到这一点?

2 个答案:

答案 0 :(得分:3)

这可能需要调整序列化器,如果它可能的话。

实体是语法糖,取而代之的是真实的&#39;解析时的字符。 DOM表示中不存在实体字符串&[entity-name];

如果输出编码(在您的情况下为UTF-8)本身支持串行器要编写的字符,因为它不知道源文档中的字符是什么样的。

我快速查看了文档,并没有看到控制实体输出的任何用途。

答案 1 :(得分:3)

这可以通过expand_entities();

来完成
use strict;
use warnings;
use XML::LibXML;
my $parser = new XML::LibXML;

#for the output you need utf8 
binmode STDOUT, ':utf8'; 

$parser->validation(1);
$parser->load_ext_dtd(1);

#Use expand_entities for retain the entities
$parser->expand_entities(0);
my $doc  = $parser->parse_file("test.xml");
foreach my $new ($doc->findnodes('test'))
{
my($name) = $new->findnodes('//firstName');
print $name."\n";
}

check more info