我目前正在尝试创建一个使用 LibXML 处理 SVG 字体数据的 perl 脚本。
在 SVG 字体中,每个字符都被定义为具有 unicode 属性的字形元素,该属性以 unicode 实体的形式定义其 unicode 地址;像这样:
<glyph unicode=" " />
我想做的部分事情是获取每个字形元素的 unicode 属性的值,然后像字符串一样处理它。但是,当我使用 Element->getAttribute('unicode'); 针对字形节点,它返回一个显示为占位符矩形的“宽字符”,这让我相信它将 unicode 实体扩展为一个 unicode 字符并返回它。
当我创建我的解析器时,我将 expand_entities 设置为 0,所以我不确定我还能做些什么来防止这种情况。我对 XML 处理相当陌生,所以我不确定我是否真的了解正在发生的事情,或者这是否应该是可以预防的。
这是一个代码示例:
use utf8;
use open ':std', ':encoding(UTF-8)';
use strict;
use warnings;
use XML::LibXML;
$XML::LibXML::skipXMLDeclaration = 1;
my $xmlFile = $ARGV[0];
my $parser = XML::LibXML->new();
$parser->load_ext_dtd(0);
$parser->validation(0);
$parser->no_network(1);
$parser->recover(1);
$parser->expand_entities(0);
my $xmlDom = $parser->load_xml(location => $xmlFile);
my $xmlDomSvg = XML::LibXML::XPathContext->new();
$xmlDomSvg->registerNs('svg', 'http://www.w3.org/2000/svg');
foreach my $myGlyph ($xmlDomSvg->findnodes('/svg:svg/svg:defs/svg:font/svg:glyph', $xmlDom))
{
my $myGlyphCode = $myGlyph->getAttribute('unicode');
print $myGlyphCode . "\n";
}
注意:如果我运行 print $myGlyph->toString();,输出中的 unicode 实体不会被扩展,因此我得出结论,扩展发生在 getAttribute 方法中。