使用XML解析Perl:简单并添加转义字符

时间:2012-01-24 19:15:39

标签: perl escaping

我需要从我正在进行的xml解析中返回的数据中转义某些字符值。问题是我需要对xml解析中的所有值进行某种检查。例如,如果我有以下内容:

<data>this is sample data"</data>

我需要能够在双引号字符值前面添加一个转义字符,这样如果该值存储到$ x,并且我打印$ x,它将显示:

this is sample data\"

感谢。

3 个答案:

答案 0 :(得分:2)

这与XML,解析或其组合无关。你有一个包含

的变量
this is sample data"

您想要将该变量更改为包含

this is sample data\"

您可以使用quotemeta

转义每个非单词字符
my $s = 'this is sample data"';
my $escaped = quotemeta($s);

您可以使用替换运算符转义某些字符(例如\")。

my $s = 'this is sample data"';
( my $escaped = $s ) =~ s/(?=[\\"])/\\/g;

Perl 5.14 +:

my $s = 'this is sample data"';
my $escaped = $s =~ s/(?=[\\"])/\\/rg;

答案 1 :(得分:2)

来自XML::Simple perldoc:

  

默认情况下,“XMLout()”会翻译字符'&lt;','&gt;','&amp;'和   '''分别来自&lt;&gt;&amp;&quot;

如果您希望在从hashref转换为XML字符串时(即在将XML写回文件之前)将这些字符正确转义为有效XML,那么您无需更改任何内容。

如果要在转换为XML字符串时以其他方式转义这些字符,则应扩展XML::Simple并覆盖escape_value()方法(请注意,反斜杠不是正确的方法XML中的那些字符。)

如果由于某些其他原因想要转义XMLin()生成的hashref中的标量值的内容,那么其他答案就可以完成。

答案 2 :(得分:0)

XML::Simple不会为您转义字符,因为XML转义是在实体中完成的 - 例如双引号表示为&quot;

Perl内置函数quotemeta可能就是您想要的。它逃脱了不是字母数字或下划线的一切。

print quotemeta q/this is sample data"/;

<强>输出

this\ is\ sample\ data\"