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

问题描述 投票:1回答:2

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

Perl code

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>

我如何保持相同的内容。

xml perl libxml2
2个回答
1
投票

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

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

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


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

© www.soinside.com 2019 - 2024. All rights reserved.