Perl, XML i codificació
Publicat el 26/12/2007
Perl té força mòduls per tractar XML –o arbres semblants a XML com HTML– com per exemple XML::DOM, XML::SAX, XML::XPath o XML::XSLT.
Tot i que inicialment el més atractiu per transformar un XML en un altre és XML::XSLT, no té tot el necessari d'XSLT implementat cosa que el fa tediós d'usar; així doncs el més còmode si estas habituat a XSLT és XML::XPath.
El problema de tots ells, és que independentment de la codificació de l'XML d'entrada la sortida la fa en ISO-8859-1 si pot. Sinó usa UTF-8.
És a dir, fa que un XML que sigui expressable en ISO-8859-1, tingui una sortida segura en aquesta codificació.
Per exemple, donat un XML tal que:
<?xml version="1.0" encoding="UTF-8"?>
<ul id="menu">
<li>ítem 1</li>
<li>ítem 2</li>
<li>ítem 3</li>
</ul>
Al processar-lo amb un script tal que:
#! /usr/bin/perl
use strict;
use XML::XPath;
my $file = "../menu.xml";
my $xp = XML::XPath->new( filename => $file );
my $list = XML::XPath::Node::Element->new( 'ul' );
my $items = $xp->find( '//ul[1][@id]/li' );
foreach my $item ( $items->get_nodelist() ) {
$list->appendChild( $item )
}
print $list->toString;
Com que l'XML només té accents permesos en ISO-8859-1, el resultat seria en aquesta codificació.
Per assegurar que el document final ha d'estar en UTF-8 cal usar el mòdul Encode (per defecte a Perl 5.8) i codificar explícitament la sortida:
#! /usr/bin/perl
use strict;
use Encode;
use XML::XPath;
my $file = "../menu.xml";
my $xp = XML::XPath->new( filename => $file );
my $list = XML::XPath::Node::Element->new( 'ul' );
my $items = $xp->find( '//ul[1][@id]/li' );
foreach my $item ( $items->get_nodelist() ) {
$list->appendChild( $item )
}
print encode("UTF-8", $list->toString);
Comentaris