我是Perl和CPAN模块的初学者
我想转换一个xml文件包括:
<Item><Link>http://example.com/</Link></Item>....
要
<Item><Link>http://mysite.com/</Link></Item>....
你有智能解决方案吗?使用 CPAN模块
答案 0 :(得分:3)
等
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>
答案 1 :(得分:3)
下面是使用XML :: Twig的简单解决方案。与XML :: Simple选项相比,无论XML中的Link
元素位于何处,它都可以工作,并且它将遵循文件的原始格式。如果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
}
答案 2 :(得分:0)
如果你需要的只是改变一个特定的值,你真的不需要任何特殊的东西,你可以简单地使用正则表达式:
从命令行:
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")