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

<? ..... ?>テキスト (の一部) ではなく、処理命令です。XML を追加するとset_text、テキストとして処理されるため、&lt;.

XML::Twig自身も詳しくありませんが、テキストではなく処理命令を追加する可能性があるかどうかを確認する必要があると思います。

于 2012-11-01T12:45:24.720 に答える