我怎样才能逃避Perl中的XML文档中的文本?(How can I escape text for

2019-06-26 03:30发布

任何人都知道任何Perl模块,逃脱的XML文档中的文本?

我生成XML将包含由用户输入的文本。 我想正确处理文本,以便生成的XML很好地形成。

Answer 1:

我个人更喜欢XML ::的libxml -的Perl libxml的结合。 其中的利弊 - 它使用最快的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();

而且,永远,永远手动创建XML。 这会有损于你的健康,当人们发现你做了什么。



Answer 2:

我不知道为什么你需要逃避的文字是在一个XML文件中。 如果您的文件包含:

<foo>x < y</foo>

该文件不是尽管尖括号泛滥的XML文件。 一个XML文件必须包含有效的数据含义是这样的:

<foo>x &lt; y</foo>

要么

<foo><![CDATA[x < y]]></foo>

因此,无论是:

  1. 你是不是要求在XML文件中逸出的数据。 相反,你要弄清楚如何把字符数据的XML文件,以便生成的文件是有效的XML; 要么

  2. 你必须在需要进行转义一些其他原因的XML文件的一些数据。

详细地谈一谈?



Answer 3:

该XML ::简单escape_value也可以用于,但不建议在新程序中使用XML ::简单的。 看到这个帖子后17436965。

手工添加逃逸可以使用正则表达式(从escape_value复制)来完成:

$data =~ s/&/&amp;/sg;
$data =~ s/</&lt;/sg;
$data =~ s/>/&gt;/sg;
$data =~ s/"/&quot;/sg;


Answer 4:

使用XML ::代码 。

从CPAN

XML ::代码逃生()

通常情况下,节点的任何内容将渲染(即特殊符号像“&”将用相应实体取代)期间逸出。 零参数,以防止它逃跑调用():

        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>


Answer 5:

XML ::实体 :

use XML::Entities;
my $a_encoded = XML::Entities::numify('all', $a);

编辑:XML ::实体仅numifies HTML实体。 使用HTML ::实体 encode_entities($ A),而不是



Answer 6:

使用

XML ::发电机

需要XML ::发生器;

我的$ XML = XML ::发电机 - >新( ':漂亮',逃避=> '总是者');

打印XML- $> H1( “&<>非HTML纯文本<>&”);

这将打印所有内容里面的标签逃脱(不带标记冲突)。



Answer 7:

检查出XML ::守则建议Krish后,我发现,这可以使用XML ::代码来完成text()函数。 例如,

use XML::Code;
my $text = new XML::Code('=');
$text->set_text(q{> & < " ' "});
print $text->code(); # prints &gt; &lt; &amp; " ' "

通过“=”创建打印了不包含标记时文本节点。 注:文本数据这仅适用。 它不会正确逃生的属性。



Answer 8:

虽然你更好地使用像模块XML::LibXMLXML::Code ,你可以在一个CDATA部分包裹文本数据。 你只能小心不要把]]>在它(这个顺序也不允许CDATA节之外 !):

$text =~ s/\]\]>/]]>]]&gt;<![CDATA[/;
$text = "<![CDATA[$text]]>";
$xml = "<foo>$text</foo>"; 

作为奖励你的代码看起来更Perlish的混淆! :-)



Answer 9:

对于那些需要处理每一种特殊情况的方案,通过各种手段使用的官方图书馆这项任务。 然而, 理论上只有5个字符需要转义的 XML格式。

因此,对于你不想在,下面的Perl表达式应该足够了一个额外的库拉一个权衡:

perl -pe 's/\&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g; s/"/\&quot;/g; s/'"'"'/\&apos;/g'


文章来源: How can I escape text for an XML document in Perl?