XML :: LibXML将字符实体从十六进制更改为十进制

时间:2018-08-22 13:17:21

标签: xml perl libxml2

如何停止Perl XML::LibXML 从特殊字符从十进制更改为十六进制,例如从&#xA更改为&#10

Perl代码

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.&#xA;&#xA;"/>
</content>

但是,当Perl脚本尝试更新同一文件时,它将更改为:

<?xml version="1.0" encoding="utf-8"?>
<content>
<type sRemark="30 minutes.&#10;&#10;"/>
</content>

如何维护相同的内容。

2 个答案:

答案 0 :(得分:1)

解析文档时, libxml2 会丢失以十进制还是十六进制提供数字字符引用的信息。对于任何理智的应用程序,选择哪种表示形式都无关紧要。但是由于十六进制字符引用恰好是canonical representation,因此您可以尝试使用toStringC14N进行序列化。

print $doc->toStringC14N; # Will output &#xA;

请注意,这也会规范化XML文档的其他部分,这可能是您可能需要的,也可能不是。另请参阅其他规范化方法和选项的文档。

答案 1 :(得分:0)

字符串&#xA在XML中将被编码为&amp;#xAXML::LibXML将自动对其进行编码。将XML打印为序列化字符串将产生编码字符。要打印解码的字符,请使用getAttribute方法。

use XML::LibXML;

my $doc = XML::LibXML::Document->new('1.0', 'utf-8');
my $string = '&#xA';
my $node = $doc->createElement('Element');
$node->setAttribute('attr', $string);

print $node->toString."\n"; # prints <Element attr="&amp;#xA"/>
print $node->getAttribute('attr')."\n"; # prints &#xA

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