如何阻止Perl XML::LibXML
将特殊字符从十进制更改为十六进制,如

到

?
use XML::LibXML;
open my $fh, '<', $File;
my $doc = XML::LibXML->load_xml(IO => $fh);
open (my $fh, '>', $File) or die $!;
print $fh $doc;
close $fh;
第三方工具(基于.net)和Perl脚本需要处理相同的XML文件。 第三方工具生成的XML包含:
<?xml version="1.0" encoding="utf-8"?>
<content>
<type sRemark="30 minutes.

"/>
</content>
但是,当Perl脚本尝试更新同一个文件时,它会更改为:
<?xml version="1.0" encoding="utf-8"?>
<content>
<type sRemark="30 minutes. "/>
</content>
我如何保持相同的内容。
解析文档时,libxml2会丢失数字字符引用是以十进制还是十六进制提供的信息。对于任何理智的应用程序,选择哪种表示无关紧要。但由于十六进制字符引用恰好是canonical representation,您可以尝试使用toStringC14N
序列化。
print $doc->toStringC14N; # Will output 

请注意,这将标准化XML文档的其他部分,这可能是您可能需要的,也可能不是。另请参阅其他标准化方法和选项的文档。
字符串

将在XML中编码为&#xA
。 XML::LibXML
将自动编码。将XML作为序列化字符串打印将产生编码字符。要打印已解码的字符,请使用getAttribute
方法。
use XML::LibXML;
my $doc = XML::LibXML::Document->new('1.0', 'utf-8');
my $string = '
';
my $node = $doc->createElement('Element');
$node->setAttribute('attr', $string);
print $node->toString."\n"; # prints <Element attr="&#xA"/>
print $node->getAttribute('attr')."\n"; # prints 

请注意,如果您的字符串位于元素的文本内容部分,则应使用$node->textContent
。