2011-01-06 12 views

答えて

3
  • XML::Twigを参照してください。
  • またはXML::Simple - 簡単APIは、XML(ESP設定ファイル)のような

を維持するために

use strict; 
use warnings; 
use XML::Simple; 
use Data::Dumper; 

my $xml = q~<?xml version='1.0'?> 
<root> 
    <Item> 
    <Link>http://example.com/</Link> 
    </Item> 
    <Item> 
    <Link>http://example1.com/</Link> 
    </Item> 
</root>~; 

print $xml,$/; 

my $data = XMLin($xml); 

print Dumper($data); 

foreach my $test (@{$data->{Item}}){ 
    foreach my $key (keys %{$test}){ 
     $test->{$key} =~ s/example/mysite/; 
    } 
} 
print XMLout($data, RootName=>'root', NoAttr=>1,XMLDecl => 1); 

出力:

<?xml version='1.0'?> 
<root> 
    <Item> 
    <Link>http://example.com/</Link> 
    </Item> 
    <Item> 
    <Link>http://example1.com/</Link> 
    </Item> 
</root> 
$VAR1 = { 
      'Item' => [ 
        { 
         'Link' => 'http://example.com/' 
        }, 
        { 
         'Link' => 'http://example1.com/' 
        } 
        ] 
     }; 
<?xml version='1.0' standalone='yes'?> 
<root> 
    <Item> 
    <Link>http://mysite.com/</Link> 
    </Item> 
    <Item> 
    <Link>http://mysite1.com/</Link> 
    </Item> 
</root> 
0

あなたが必要とするすべてが特定の値を変更している場合は、あなたは本当に特別なものは必要ありません、単に正規表現を使用することができます:
コマンドラインから:

perl -pi -e '[email protected]://example.com/@http://mysite.com/@g' file.xml 

編集:完全なコードバージョン追加:XMLを使用して

my $file = '/tmp/test.xml'; 

open IN, "<$file" or die "can't open $file $!"; 
open OUT, ">$file.tmp" or die "can't open $file.tmp $!"; 
foreach (<IN>) { 
    [email protected]://example.com/@http://mysite.com/@g; 
    print OUT $_; 
} 
close(IN); 
close(OUT); 

rename("$file.tmp", "$file") 
+0

+1正規表現の解決策を指定するには、XMLの宗教的な善意者があなたを無慈悲に罰するでしょう!開放的で有用なシステム管理者であることの秘訣は、単純な解決策をいつ使用するのか、重量の重いものをいつ使用するのかを知ることです(単純な解決策では時折十分であるという考えはほとんどありません)。 –

+0

ありがとうございました:)これはまさに私がXMLについてどのように感じているか、時にはこのようなものを変更するために完全なXMLライブラリを必要としないことがあります。 – OneOfOne

+1

これは、XMLの残りの部分についてはあまり情報がありません。私たちが知っているすべてのものには、URLを含む他の要素が含まれるかもしれません。あるいは、将来それらを含むかもしれない。だからこそ私はむしろ正しい解決策を提供しています。 – mirod

3

シンプルなソリューションを::小枝は以下の通りです。 XML :: Simpleオプションと比較すると、要素がXML内のどこにあっても機能し、ファイルの元のフォーマットを尊重します。また、XMLに混在コンテンツが含まれている場合にも機能します。

あなたの場所にファイルを変更する必要がある場合は、代わりにparsefileparsefile_inplaceを使用することができ、私はsubs_textの正規表現は、実際の生活の中で改善する必要があるかもしれませんが、このコードは良い出発点であるべきと思います。

#!/usr/bin/perl 

use strict; 
use warnings; 

use XML::Twig; 

XML::Twig->new(twig_roots => { Link => \&replace_link, }, # process Link 
       twig_print_outside_roots => 1,    # output everything else 
      ) 
      ->parsefile('my.xml'); 

sub replace_link 
    { my($t, $link)= @_; 
    $link->subs_text(qr{^http://example\.com/$}, 'http://mysite.com'); 
    $t->flush;    # or $link->print, outputs the modified (or not) link 
    }   
関連する問題