0

チルダ ( ) で囲まれたテキストを検索し、そのテキストの先頭に~文字列を追加します。たとえば、XML ファイルで を置換~it~~T1it~てから、結果を別のファイルに保存します。XPathを使用してテキストを取得する方法とそれを置き換える方法は知っていますが、置き換えられたテキストをその場所に配置して出力する方法はわかりません。

ここに私の入力XMLがあります:

<?xml version="1.0"?>
<chapter>
<section>
<para id="p001">this is<math>~rom~This is roman~normal~</math>para</para>
<para id="p002">this is<math>~rom~This is roman~normal~</math>para</para>
<para id="p003">this is<math>~rom~This is roman~normal~</math>para</para>
</section>
<abstract>
<para id="p004">This is <math>~rom~This is roman~normal~</math>para</para>
<para id="p005">this is<math>~rom~This is roman~normal~</math>para</para>
<para id="p006">this is<math>~rom~This is roman~normal~</math>para</para>
</abstract>
</chapter>

これが私のPerlスクリプトです:

use strict;
use warnings;
use XML::LibXML;
#use XML::LibXML::Text;
use Cwd 'abs_path';
my $x_name=abs_path($ARGV[0]);
my $doc = XML::LibXML->load_xml(location => $x_name, no_blanks => 1);
my $xpath_expression='/chapter/section/para/math';
my @nodes = $doc->findnodes( $xpath_expression );
foreach my $node(@nodes){
  my $content = $node->textContent;
  $content=~s#\~rom\~#~T1rom~#sg;
  print $content,"\n";
}

ここに私の望ましい出力があります:

<?xml version="1.0"?>
<chapter>
<section>
<para id="p001">this is<math>~T1rom~This is roman~normal~</math>para</para>
<para id="p002">this is<math>~T1rom~This is roman~normal~</math>para</para>
<para id="p003">this is<math>~T1rom~This is roman~normal~</math>para</para>
</section>
<abstract>
<para id="p004">This is <math>~rom~This is roman~normal~</math>para</para>
<para id="p005">this is<math>~rom~This is roman~normal~</math>para</para>
<para id="p006">this is<math>~rom~This is roman~normal~</math>para</para>
</abstract>
</chapter>
4

1 に答える 1

2

1 つの可能性: 次のsetDataメソッドを使用しますXML::LibXML::Text

#!/usr/bin/perl
use warnings;
use strict;

use XML::LibXML;    

my $x_name = $ARGV[0];
my $doc = XML::LibXML->load_xml(location => $x_name, no_blanks => 1);
my $xpath_expression = '/chapter/section/para/math/text()';
my @nodes = $doc->findnodes( $xpath_expression );
for my $node (@nodes) {
    my $content = $node->toString;
    $content =~ s#\~rom\~#~T1rom~#sg;
    $node->setData($content);
}
$doc->toFile($x_name . '.new', 1);
于 2013-06-21T11:19:39.703 に答える