如何在Perl中转义XML文档的文本?

col*_*deq 3 xml perl escaping

有人知道任何Perl模块要转义XML文档中的文本吗?

我正在生成XML,其中包含用户输入的文本.我想正确处理文本,以便生成的XML格式正确.

zak*_*rya 9

我个人更喜欢XML :: LibXML - 用于libxml的Perl绑定.其中一个优点 - 它使用了最快的XML处理库之一.以下是创建文本节点的示例:

use XML::LibXML;
my $doc = XML::LibXML::Document->new('1.0',$some_encoding);
my $element = $doc->createElement($name);
$element->appendText($text);
$xml_fragment = $element->toString();
$xml_document = $doc->toString();
Run Code Online (Sandbox Code Playgroud)

而且,永远不要手工创建XML.当人们发现你做了什么时,这会对你的健康造成不利影响.


Sin*_*nür 8

我不知道为什么你需要转义XML文件中的文本.如果您的文件包含:

<foo>x < y</foo>
Run Code Online (Sandbox Code Playgroud)

尽管尖括号增加,但该文件不是 XML文件.XML文件必须包含有效数据,这意味着:

<foo>x &lt; y</foo>
Run Code Online (Sandbox Code Playgroud)

要么

<foo><![CDATA[x < y]]></foo>
Run Code Online (Sandbox Code Playgroud)

因此,要么:

  1. 您不是要求在XML文件中转义数据.相反,您想要弄清楚如何将字符数据放在XML文件中,以便生成的文件是有效的XML; 要么

  2. 您在XML文件中有一些数据需要通过其他原因进行转义.

注意详细说明?

  • 当你提醒他们他们的伪XML实际上不是真正的XML时,人们会生气.这很有趣......而且很伤心.无论如何,我赞成你:) (2认同)

Wad*_*ter 8

也可以使用XML :: Simple escape_value,但不建议对新程序使用XML :: Simple.查看此帖子17436965.

可以使用正则表达式(从escape_value复制)完成手动转义:

$data =~ s/&/&amp;/sg;
$data =~ s/</&lt;/sg;
$data =~ s/>/&gt;/sg;
$data =~ s/"/&quot;/sg;
Run Code Online (Sandbox Code Playgroud)


joe*_*joe 6

使用XML :: Code.

来自CPAN

XML :: code escape()

通常,在渲染期间将对节点的任何内容进行转义(即,诸如"&"的特殊符号将被相应的实体替换).使用零参数调用escape()以防止它:

        my $p = XML::Code->('p');
        $p->set_text ("&#8212;");
        $p->escape (0);
        print $p->code(); # prints <p>&#8212;</p>
        $p->escape (1);
        print $p->code(); # prints <p>&amp;#8212;</p>
Run Code Online (Sandbox Code Playgroud)