質問

私は初心者のためのPerl、CPANモジュール

いに変換するxmlファイル:

<Item><Link>http://example.com/</Link></Item>....

<Item><Link>http://mysite.com/</Link></Item>....

いスマートソリューション?と CPANモジュール

役に立ちましたか?

解決

  • XML::小枝 -Perlモジュール処理の巨大なXML文書ツリーモードになります。
  • または XML::シンプルな -やすいAPIを維持XMLフォーキャスト設定ファイル)

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>

他のヒント

XMLを使用して

簡単な解決策::小枝は以下の通りです。 XML :: Simpleはオプションと比較すると、それはLink要素がXMLであるに関係なく動作しますが、それはファイルの元の書式を尊重します。それ意志もXMLが混合コンテンツが含まれている場合は、作業ます。

あなたの場所にファイルを変更する必要がある場合は、

は、あなたの代わりにparsefile_inplaceparsefileを使用することができる、と私は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
  }           

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

perl -pi -e 's@http://example.com/@http://mysite.com/@g' file.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>) {
    s@http://example.com/@http://mysite.com/@g;
    print OUT $_;
}
close(IN);
close(OUT);

rename("$file.tmp", "$file")
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top