我正在尝试使用XML:LibXML向现有XML节点添加其他属性,当我尝试实现此目的时,所有编码实体(如&dagger
,¶
都将转换为纯UTF-8字符。如何避免这种转换并保留原始编码?
XML:
<?xml version="1.0"?>
<!DOCTYPE test SYSTEM "test.dtd">
<test>
<name>
<firstName>firstname‡</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字符而不是实体。所以我想保留输出中的文本。有没有办法做到这一点?
答案 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";
}