逃避文本中的特殊字符

时间:2012-11-01 12:24:05

标签: perl

我正在阅读一个xml文件,并添加了一些额外的文本,但由于某些特殊字符会自动转换,因此我无法获得准确的文字。

我试试这个:

<book>
  <book-meta>
    <book-id pub-id-type="doi">1545</book-id>
    <book-title>Regenerating <?tex?> the Curriculum</book-title>
  </book-meta>
</book>

脚本:

use strict;

use XML::Twig;

open(my $out, '>', 'Output.xml') or die "can't Create stroy file $!\n";

my $story_file = XML::Twig->new(
    twig_handlers => {
        'book-id'       => sub { $_->set_text('<?sample?>') },
        keep_atts_order => 1,
    },
    pretty_print => 'indented',
);

$story_file->parsefile('sample.xml');
$story_file->print($out);

输出:

<book>
  <book-meta>
    <book-id pub-id-type="doi">&lt;?sample?></book-id>
      <book-title>Regenerating <?tex?> the Curriculum</book-title>
  </book-meta>
</book>

我想输出为:

<book>
      <book-meta>
        <book-id pub-id-type="doi"><?sample?></book-id>
          <book-title>Regenerating <?tex?> the Curriculum</book-title>
      </book-meta>
    </book>

如何在XML twig中转义此类字符。我尝试了set_asis选项,但我无法让它工作。

2 个答案:

答案 0 :(得分:2)

XML::Twig正在为您正确插入字符串<?sample?>,因为您要求添加PCDATA节点,并且<必须在此类节点中替换为&lt; 。但是你想要的是一个处理指令节点。

使用XML::Twig插入此类节点的最简单方法是使用set_inner_xml方法,该方法将解析字符串中的XML树片段并将其作为当前节点的内容插入。

如果您更换

$_->set_text('<?sample?>')

$_->set_inner_xml('<?sample?>')

然后你的代码应该做你想要的。我得到的输出是

<book>
  <book-meta>
    <book-id pub-id-type="doi"><?sample?></book-id>
    <book-title>Regenerating <?tex?> the Curriculum</book-title>
  </book-meta>
</book>

答案 1 :(得分:1)

<? ..... ?>不是(部分)文本,而是处理指令。当您使用set_text添加XML时,它会以文本形式处理,因此&lt;

我自己并不熟悉XML::Twig,但我认为您应该检查是否可以添加处理指令而不是文本。