これはXML :: Twigで行うことができます。
以下のコードは、入力に関する仮定が非常に少ないという点で非常にきれいです。特に、接頭辞ではなく入力の名前空間のURIに依存しています。小枝は、要素が解析されるたびにフラッシュされるため、メモリ内のデータはほとんど保持されません。
#!/usr/bin/perl
use strict;
use warnings;
use XML::Twig;
# parameters, may be changed
my $SR = 'sr'; # local name of the root of the fragment
my $OUT = 'a'; # prefix in the output
my $IN_NS = 'http://www.example.com/mmm'; # namespace URIs
my $OUT_NS = 'http://www.example.com/aaa';
my $t= XML::Twig->new(
map_xmlns => { $IN_NS => $OUT, $OUT_NS => $OUT, },
start_tag_handlers => { "$OUT:$SR" => \&change_ns_decl, },
twig_handlers => { _all_ => sub { $_->flush; }, },
keep_spaces => 1,
)
->parse(\*DATA); # replace by parsefile("my.xml");
exit;
sub change_ns_decl
{ my($t, $sr)= @_;
$sr->set_att("xmlns:$OUT" => $OUT_NS);
}
__DATA__
<?xml version="1.0" encoding="utf-8"?>
<m:sr xml:lang="et" xmlns:m="http://www.example.com/mmm">
<m:A m:AS="EX" m:KF="sss1">
<m:m m:u="uus" m:O="ggg">ggg</m:m>
</m:A>
</m:sr>
。私がそれを行ごとに読んだら、このメソッドはすばやくすべてのメモリを使います。 – Paxmees
私が提案したのは、次の入力行を処理する前に各行を出力ファイルに書き込むことでした。これはすぐにメモリ不足になることはありません。 –