1

我正在读取一个 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 树枝中转义这种类型的字符。我尝试了该set_asis选项,但无法使其正常工作。

4

2 回答 2

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>
于 2012-11-01T12:56:00.153 回答
1

<? ..... ?>不是(部分)文本,而是处理指令。当您添加它时,您的 XMLset_text将被处理为文本,因此&lt;.

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

于 2012-11-01T12:45:24.720 回答