【问题标题】:XML::LibXML changing character entity from hex to decimalXML::LibXML 将字符实体从十六进制更改为十进制
【发布时间】:2023-03-20 16:15:01
【问题描述】:

如何停止 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>

我怎样才能保持相同的内容。

【问题讨论】:

  • 你可能无法改变这一点。如果您的 XML 语法很重要,那么您就没有正确使用它。
  • 您的代码中没有任何内容可以生成十六进制字符实体。请说明您是如何看待这种不良行为的。

标签: xml perl libxml2


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    字符串 &amp;amp;#xA 将在 XML 中编码为 &amp;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-&gt;textContent

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-31
      • 2018-01-22
      • 2019-02-21
      • 2019-07-27
      • 1970-01-01
      • 2012-02-03
      • 1970-01-01
      相关资源
      最近更新 更多