あなたの天然記念物
ホーム更新雑談Perl鉄ゲタランドナーコースガイド自転車Linuxリンク経歴連絡先

XML::LibXMLでシフトJISのXMLを読み込む (2017.08.03)

背景

興味深い記事を見つけたので追試と原因追及を行い今後の糧としたい。

「文字コードShift_JISのXMLをパースしようとしてしばらくハマった」
PerlのXML::LibXMLモジュールでShift_JISのXMLのパース | 電書魂

コード

【備考】XML::LibXMLのインストール前にlibxml2-develをスーパユーザからインストールしました。 2017.08.03 変数を削り見やすくしました。
#!/usr/bin/env perl

use utf8;
use warnings;
use strict;
use open IO => ":utf8";

use Encode::Locale;
use XML::LibXML;

binmode STDOUT, ":encoding(console_out)";

$| = 1;

my $parser = XML::LibXML->new;
$parser->no_network(1);
for (@{$parser->parse_file("sample_5.xml")->findnodes('///TEST')}) {
	print "$_\n";
}

exit;

XMLファイル

件の記事からコピー&ペースト、シフトJISで保存してXMLファイルとしました。
<?xml version="1.0" encoding="Shift_JIS"?>
<TEST>
<CONTENTS>
<PARAGRAPH>吾輩は猫である。名前はまだ無い。</PARAGRAPH>
<PARAGRAPH>どこで生れたかとんと見当がつかぬ。</PARAGRAPH>
<PARAGRAPH>何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。</PARAGRAPH>
<PARAGRAPH>吾輩はここで始めて人間というものを見た。</PARAGRAPH>
<PARAGRAPH>しかもあとで聞くとそれは書生という人間中で一番獰悪な種族であったそうだ。</PARAGRAPH>
</CONTENTS>
</TEST>

結果

Linux上での動作です。 2017.08.03 Windows(ActivePerl)で同様にパースできました。 件の記事があるブログを拝見してマッキントッシュでの挙動と推測しましたけれど環境がありません。
<TEST>
<CONTENTS>
<PARAGRAPH>吾輩は猫である。名前はまだ無い。</PARAGRAPH>
<PARAGRAPH>どこで生れたかとんと見当がつかぬ。</PARAGRAPH>
<PARAGRAPH>何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。</PARAGRAPH>
<PARAGRAPH>吾輩はここで始めて人間というものを見た。</PARAGRAPH>
<PARAGRAPH>しかもあとで聞くとそれは書生という人間中で一番獰悪な種族であったそうだ。</PARAGRAPH>
</CONTENTS>
</TEST>
…動いちゃったよ、コレ。どうしよう。

結論

読み込みの成否に環境依存の可能性がある。 「将来このモジュールで失敗したら原因追求する」と日記に書いておこう。