perlをXMLに変換解
-
26-09-2019 - |
質問
私は初心者のための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_inplace
のparsefile
を使用することができる、と私は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")
所属していません StackOverflow