Возможно, это не тот ответ, который вы ищете, но IMHO getAttribute
дает вам достаточно информации, например, строки Perl, для решения вашей проблемы другим способом.Вы пытаетесь записать эту строку Perl в файл, отличный от UTF8, поэтому вы получаете предупреждение "широкий символ".
Урезанный пример того, как получить искомое значение U+xxxx
:
use strict;
use warnings;
use open qw(:encoding(UTF-8) :std);
use XML::LibXML;
my $dom = XML::LibXML->load_xml(IO => \*DATA)
or die "XML\n";
my $root = $dom->documentElement();
print $root->toString(), "\n";
my $attr = $root->getAttribute('unicode');
printf("'%s' is %d (U+%04X)\n", $attr, ord($attr), ord($attr));
exit 0;
__DATA__
<glyph unicode=" " />
Тестовый прогон:
$ perl dummy.pl
<glyph unicode=" "/>
' ' is 8192 (U+2000)
ОБНОВЛЕНИЕ: Документация для expand_entities
ИМХО вводит в заблуждение.В нем говорится о «сущностях», но, очевидно, это означает ENTITY
определений, то есть новых сущностей, введенных в документ.Документация libxml2 , к сожалению, не так понятна.Но это старое сообщение , кажется, указывает на ожидаемое вами поведение, т.е.синтаксический анализатор XML всегда должен заменять предварительно определенные объекты:
#!/usr/bin/perl
use warnings;
use strict;
use XML::LibXML;
my $parser = XML::LibXML->new({
expand_entities => $ARGV[0] ? 1 : 0,
});
my $dom = $parser->load_xml(IO => \*DATA)
or die "XML\n";
my $root = $dom->documentElement();
print "toString(): ", $root->toString(), "\n";
print "textContent: ", $root->textContent(), "\n";
my $attr = $root->getAttribute('test');
print "attribute: ${attr}\n";
exit 0;
__DATA__
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY author "Fluffy Bunny">
]>
<tag test="<&author;>"><&author;></tag>
Тестовый прогон:
$ perl dummy.pl 0
toString(): <tag test="<&author;>"><&author;></tag>
textContent: <Fluffy Bunny>
attribute: <Fluffy Bunny>
$ perl dummy.pl 1
toString(): <tag test="<Fluffy Bunny>"><Fluffy Bunny></tag>
textContent: <Fluffy Bunny>
attribute: <Fluffy Bunny>