平たく言うと文字化けでBioPerl(っちゅうか、XML::Parser)がコケる・解決編
2010-03-04 - chalk-less::weblog::theclaで書いたとおり、
Unit de Recherches sur le D velopement Normal et Pathologi
que de Systme Immunitaire INSERM U429 Paris, France.
ってのがMEDLINEに出てきて、この、
not well-formed (invalid token) at line 43, column 29, byte 3156 at /opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/XML/Parser.pm line 187
とりあえず、このフランス語をどうするか、ということで、「フランス語 Perl 文字化け」とかでググったら、http://www.biwa.ne.jp/~lagoinst/natsume/info/pdf/StringProcessingWithPerl.pdfってPDFがヒットした。ようするに、iso-8859-1をエンコードとして指定すればいいらしい。iso-8859-1には、ドイツ語、スペイン語も含まれている(=処理可能)とある(英語も入っている)。で、どうやってこの情報を渡すかなのだが、XML::Parserのソースを眺めていたらば、以下の記述が。
Expat has built-in encodings for: "UTF-8", "ISO-8859-1", "UTF-16", and
"US-ASCII". Encodings are set either through the XML declaration encod‐
ing attribute or through the ProtocolEncoding option to XML::Parser or
XML::Parser::Expat.
ようするに、XMLファイルのencodingの宣言を見る、それか指定しろ、ということと判断。
MEDLINE XMLの宣言はどうなっているか見てみると
<?xml version="1.0"?>
で、ようするに宣言していなかった。
Data::Dumper でBIo::Biblio::IOのつくるオブジェクトの中身を見たものの、どうやってencoding情報をXML::Parserに渡すかわからず。
ということで、XMLを書き換えて、encodingの宣言をしてしまうことに。
<?xml version="1.0"?>
↓
<?xml version="1.0" encoding="iso-8859-1"?>
これを処理させたらば、うまく行きました。