• 締切済み

[Perl]Shift-JISのXMLを解析する場

行き詰まってしまったので教えて下さい。 <やりたいこと> とあるAPIからXMLファイルを取得し、解析して出力する、ということをやっているのですが、元のXMLがShift-JISでエンコーディングされており、これをUTF-8に変換して出力しようとしています。 <問題> XMLを取得して解析、取り出したいパラメータが出力できるようにはなったのですが、文字のエンコーディングが上手く行っていないためか、文字化けしてしまいます。 <元のXML> <?xml version="1.0" encoding="Shift_JIS"?>  <test>   <prod count=3>    <record>     <code>アイウエ</code>    </record>    <record>     <code>カキクケ-</code>    </record>    <record>     <code>ABC</code>    </record>   </prod>  </test> <XML解析用のコード> #!usr/bin/perl use utf8; use Encode qw/ from_to encode decode /; use Encode::Guess qw/ euc-jp shiftjis 7bit-jis /; use LWP::UserAgent; use XML::Simple; use Data::Dumper; #--XML取得部分省略 #--XMLはgetで$xmlに格納 $from = guess_encoding($xml)->name; &from_to($xml,$from,"utf8"); $XML::Simple::PREFFERRED_PARSER = 'XML::SAX::PurePerl'; $xs = new XML::Simple(); $ref = $xs->XMLin($xml); $xml =~ s/<\?.*\?>//; for($i=0;$i<=$#{$ref->{'test'}->{'prod'}->{'record'}};$i++){  $name = $ref->{'test'}->{'prod'}->{'record'}[$i]->{'code'}; $name = encode('utf-8',$name); print "$i : $name\n"; } <結果> 黒ダイヤに?文字で文字化けして出力される。 どなたか原因がお分かりになりますでしょうか。 よろしくお願いいたします。

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

ついでに指摘しておくけど, $xml =~ s/<\?.*\?>//; ってこのあとで $xml を使っていないから全く無意味だよね.

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

いや, だから, from_to は何のため? って聞いてるんだけど.

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

ん~, 手元だと <test>, </test> の両タグが落ちてる. なんでだろ.... さておき, from_to は何のため? あと, 実は元のXML がおかしい気がする.

amnet2012
質問者

お礼

ありがとうございます。 not well formedが出てしまうので、元のXMLを疑ってみます。 一応 XML::Simple::PREFEERED_PARSER = `XML::SAX::PurePerl` で上記エラーの回避は可能ですが、今度は途中から文字化けするという謎の現象が起こってしまいます。 もう少し調べてみます。