2

在 Perl 中,我XML::Twig用来读取 XML 文件。一些属性的文本如下所示:

<p>Here is some text.</p>

<p>Some more text.

我正在将此属性读入一个名为$Body. 我想将这个变量打印到一个文件中而不插入字符串中的特殊字符,即输出应该看起来与输入完全一样。我的代码如下所示:

open (my $OUT, ">", "out.csv") or die $!;
print $OUT $Body;

但是,当我查看时out.csv,我看到:

<p>Here is some text.</p>

<p>Some more text.

相反,我想查看原始字符串:

&lt;p&gt;Here is some text.&lt;/p&gt;&#xA&;#xA;&lt;p&gt;Some more text.

我尝试了以下但没有成功:

  • print $OUT '$Body';不起作用,只显示“$Body”
  • print $OUT "$Body";不起作用,就像没有引号一样。
  • print $OUT qw{$Body};不起作用,只显示“$Body”。

    这是一个完整的例子:

tmp.xml

<?xml version="1.0" encoding="utf-8"?>
<root>
  <node Body="&lt;p&gt;Here is some text.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Some more text."/>
</root>

代码:

#!/usr/bin/perl
use strict;
use XML::Twig;

my $t=XML::Twig->new();
$t->parsefile("tmp.xml"); 

my $root= $t->root;

open (my $OUT, ">", "out.csv") or die();

my @nodes = $root->children('node');   # get the para children
foreach my $node (@nodes){ 
    my $Body = $node->{'att'}->{'Body'}; 
    print $OUT $Body;
}

结果:

[dev@mogli:/swta] $ ./script.pl 
[dev@mogli:/swta] $ cat out.csv 
<p>Here is some text.</p>

<p>Some more text.
4

2 回答 2

8

XML::Twig 正在进行解编码。将标志传递给它keep_encoding以防止这种情况发生:

my $t = XML::Twig->new(keep_encoding => 1);
于 2013-09-23T14:02:28.807 回答
3

打印标量不会改变它[1]

$ cat a.pl
$Body = '&lt;p&gt;Here is some text.&lt;/p&gt;&#xA&#xA&lt;p&gt;Some more text.';
open (my $OUT, ">", "out.csv") or die();
print $OUT $Body;

$ perl a.pl

$ cat out.csv
&lt;p&gt;Here is some text.&lt;/p&gt;&#xA&#xA&lt;p&gt;Some more text.

$Body不包含您认为的内容。XML::Twig 正确返回了节点的内容,<p>Here .... 如果节点假定包含&lt;p&gt;Here ...,则 XML 文件应包含&amp;lt;p&amp;gt;Here ....


笔记:

  1. 除非您通过添加 :encoding 层或类似的层来指示它,或者除非您在 Windows 上默认将 LF 更改为 CRLF。
于 2013-09-23T13:39:46.170 回答