XML perl Convert Solution
-
26-09-2019 - |
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
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")