任何人都知道任何Perl模块,逃脱的XML文档中的文本?
我生成XML将包含由用户输入的文本。 我想正确处理文本,以便生成的XML很好地形成。
任何人都知道任何Perl模块,逃脱的XML文档中的文本?
我生成XML将包含由用户输入的文本。 我想正确处理文本,以便生成的XML很好地形成。
我个人更喜欢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。 这会有损于你的健康,当人们发现你做了什么。
我不知道为什么你需要逃避的文字是在一个XML文件中。 如果您的文件包含:
<foo>x < y</foo>
该文件不是尽管尖括号泛滥的XML文件。 一个XML文件必须包含有效的数据含义是这样的:
<foo>x < y</foo>
要么
<foo><![CDATA[x < y]]></foo>
因此,无论是:
你是不是要求在XML文件中逸出的数据。 相反,你要弄清楚如何把字符数据的XML文件,以便生成的文件是有效的XML; 要么
你必须在需要进行转义一些其他原因的XML文件的一些数据。
详细地谈一谈?
该XML ::简单escape_value也可以用于,但不建议在新程序中使用XML ::简单的。 看到这个帖子后17436965。
手工添加逃逸可以使用正则表达式(从escape_value复制)来完成:
$data =~ s/&/&/sg;
$data =~ s/</</sg;
$data =~ s/>/>/sg;
$data =~ s/"/"/sg;
使用XML ::代码 。
从CPAN
XML ::代码逃生()
通常情况下,节点的任何内容将渲染(即特殊符号像“&”将用相应实体取代)期间逸出。 零参数,以防止它逃跑调用():
my $p = XML::Code->('p');
$p->set_text ("—");
$p->escape (0);
print $p->code(); # prints <p>—</p>
$p->escape (1);
print $p->code(); # prints <p>&#8212;</p>
XML ::实体 :
use XML::Entities;
my $a_encoded = XML::Entities::numify('all', $a);
编辑:XML ::实体仅numifies HTML实体。 使用HTML ::实体 encode_entities($ A),而不是
使用
XML ::发电机
需要XML ::发生器;
我的$ XML = XML ::发电机 - >新( ':漂亮',逃避=> '总是者');
打印XML- $> H1( “&<>非HTML纯文本<>&”);
这将打印所有内容里面的标签逃脱(不带标记冲突)。
检查出XML ::守则建议Krish后,我发现,这可以使用XML ::代码来完成text()
函数。 例如,
use XML::Code;
my $text = new XML::Code('=');
$text->set_text(q{> & < " ' "});
print $text->code(); # prints > < & " ' "
通过“=”创建打印了不包含标记时文本节点。 注:文本数据这仅适用。 它不会正确逃生的属性。
虽然你更好地使用像模块XML::LibXML
或XML::Code
,你可以在一个CDATA部分包裹文本数据。 你只能小心不要把]]>
在它(这个顺序也不允许CDATA节之外 !):
$text =~ s/\]\]>/]]>]]><![CDATA[/;
$text = "<![CDATA[$text]]>";
$xml = "<foo>$text</foo>";
作为奖励你的代码看起来更Perlish的混淆! :-)
对于那些需要处理每一种特殊情况的方案,通过各种手段使用的官方图书馆这项任务。 然而, 理论上只有5个字符需要转义的 XML格式。
因此,对于你不想在,下面的Perl表达式应该足够了一个额外的库拉一个权衡:
perl -pe 's/\&/\&/g; s/</\</g; s/>/\>/g; s/"/\"/g; s/'"'"'/\'/g'