perl XML转换解决方案

时间:2011-01-06 05:23:22

标签: xml perl parsing cpan perl-module

我是Perl和CPAN模块的初学者

我想转换一个xml文件包括:

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

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

你有智能解决方案吗?使用 CPAN模块

3 个答案:

答案 0 :(得分:3)

  • 请参阅XML::Twig - 用于以树模式处理大型XML文档的perl模块。
  • XML::Simple - 用于维护XML的简易API(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>

答案 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")