我个人更喜欢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.当人们发现你做了什么时,这会对你的健康造成不利影响.
我不知道为什么你需要转义XML文件中的文本.如果您的文件包含:
<foo>x < y</foo>
Run Code Online (Sandbox Code Playgroud)
尽管尖括号增加,但该文件不是 XML文件.XML文件必须包含有效数据,这意味着:
<foo>x < y</foo>
Run Code Online (Sandbox Code Playgroud)
要么
<foo><![CDATA[x < y]]></foo>
Run Code Online (Sandbox Code Playgroud)
因此,要么:
您不是要求在XML文件中转义数据.相反,您想要弄清楚如何将字符数据放在XML文件中,以便生成的文件是有效的XML; 要么
您在XML文件中有一些数据需要通过其他原因进行转义.
注意详细说明?
也可以使用XML :: Simple escape_value,但不建议对新程序使用XML :: Simple.查看此帖子17436965.
可以使用正则表达式(从escape_value复制)完成手动转义:
$data =~ s/&/&/sg;
$data =~ s/</</sg;
$data =~ s/>/>/sg;
$data =~ s/"/"/sg;
Run Code Online (Sandbox Code Playgroud)
使用XML :: Code.
来自CPAN
XML :: code escape()
通常,在渲染期间将对节点的任何内容进行转义(即,诸如"&"的特殊符号将被相应的实体替换).使用零参数调用escape()以防止它:
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>
Run Code Online (Sandbox Code Playgroud)