Domanda

Sono un principiante per Perl e CPAN Modules

I Wanna convertire un file XML includono:

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

Per

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

Hai soluzioni intelligenti? con CPAN modulo

È stato utile?

Soluzione

  • XML :: Twig - Un modulo Perl per l'elaborazione di grandi documenti XML in modalità albero.
  • XML :: Simple - facile API per mantenere XML (esp config file)

come,

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);

uscita:

<?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>

Altri suggerimenti

Una semplice soluzione utilizzando XML :: Twig è al di sotto. Rispetto con l'opzione XML :: Simple funziona, non importa dove gli elementi Link sono in XML, e rispetterà la formattazione originale del file. Si lavorerà anche se l'XML contiene misto contenuti.

Se è necessario modificare il file in luogo, è possibile utilizzare parsefile_inplace invece di parsefile, e ho il sospetto l'espressione regolare in subs_text può avere bisogno di essere migliorato nella vita reale, ma questo codice dovrebbe essere un buon punto di partenza.

#!/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
  }           

Se tutto ciò che serve sta cambiando un valore specifico, non si ha realmente bisogno di qualcosa di speciale, si può semplicemente utilizzare regexp:
da linea di comando:

perl -pi -e 's@http://example.com/@http://mysite.com/@g' file.xml

modifica : l'aggiunta di versione del codice completo:

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")
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top