XMLファイルをPerlで読み込む際のエラーについて

このQ&Aのポイント
  • XMLファイルをPerlで読み込んだ際に、特定の文字列がエラーを引き起こす場合があります。
  • このエラーは、XML内に存在する特定の文字列が正しく変換されないために発生します。
  • エラーを解消するためには、XMLの文字列を適切にエスケープするか、文字列の変換処理を改善する必要があります。
回答を見る
  • ベストアンサー

SAXのcharacters()内で得る値について

XML(UTF-8)ファイルをPerlでOPENして読み込んで、 XML::SAXで、 characters()メソッド内で取得した文字列値を利用していますが、 XML内に&文字が存在していると、 そこで、 utf8 "\x81" does not map to Unicode at C:/Perl/site/lib/XML/SAX/PurePerl/Reader/ Stream.pm line 37. utf8 "\x8C" does not map to Unicode at C:/Perl/site/lib/XML/SAX/PurePerl/Reader/ Stream.pm line 37. Undeclared entity [Ln: 516, Col: 21] エラーが出て強制終了されます。 どうすれば、このようなエラーを解消できますか?

  • XML
  • 回答数3
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • dscripty
  • ベストアンサー率51% (166/325)
回答No.3

external の entity は ハンドラ実装しろって、ドキュメントにかいてあったよ? メモしてないから場所はしめせないけど。。。

hohoemikun
質問者

お礼

「dscripty」様 お世話になっております。 おかげさまでご回答いただきましたように 対応致しましたところ、 無事にエラー解消致しました。 本当にありがとうございました。

その他の回答 (2)

  • dscripty
  • ベストアンサー率51% (166/325)
回答No.2

最低限必要な情報を書いておくね。 Perl::SAX のバージョン。 XML の Valid 確認で使用したツール、とバージョン。 xml宣言からルート要素までの文字列。 エラーがでた要素の開始タグから終了タグまで全部。 実装した、ハンドラのリスト。 以上! ちなみに Perl::SAX 2.1 の既知のバグには、それっぽいのはなっかたよ?

hohoemikun
質問者

お礼

「dscripty」様 お世話になっております。 エラー複数行のうち、一番下行の、 Undeclared entity [Ln: 516, Col: 21] だけは、 &文字を、&文字列に正規表現で、 XMLファイル内を全て置き換えてから SAXを実行したら解消していました。 ただし、 エラー複数行のうち、一番下行以外の複数エラー行は、 いまだにエラーのままです。 さしあたってご報告と御礼まで。 なお、エラー複数行のうち、一番下行以外の複数エラー行については、 引き続き、質問中ですので、 よろしくお願いします。

hohoemikun
質問者

補足

「dscripty」様 お世話になっております。 さっそくですが、 「最低限必要な情報」を今日調べた結果、 調べがついた範囲で一通り下記します。 (1)Perl::SAX のバージョン。  ・XML-SAX 0.99  ・XML-SAX-Base 1.08  ・XML-SAX-ExpatXS 1.32  ・XML-SAX-Writer 0.53 (2)XML の Valid 確認で使用したツール、とバージョン。  ・xmllintツール  ・バージョンを、xmlling --versionで調べたところ、    ”using libxml version 20708” (3)xml宣言からルート要素までの文字列。 <?xml version="1.0" encoding="utf-8" standalone="no"?> <!DOCTYPE dictionary SYSTEM "sampledtd.dtd"> <dictionary> (4)エラーがでた要素の開始タグから終了タグまで全部。 【すみません。  質問時に記述したエラーメッセージ内容からは、  どこの要素でエラーが発生しているか?  判断がつきません。  もし何か調べる方法などございましたら、  ぜひ教えてください。よろしくお願いします】 (5)実装した、ハンドラのリスト。 use XML::SAX; my $parserWk = XML::SAX::ParserFactory->parser( Handler => wkSAXHandler->new); $parserWk->parse_uri($inFileNameWk); start_element() end_document() start_element() end_element() characters() 以上になります。 よろしくお願いします。

  • dscripty
  • ベストアンサー率51% (166/325)
回答No.1

xml宣言から、ルート要素までの文字列と、 & でエラーがでた所の要素全部みないと、なんとも言いようがないかな? 既知のバグでもあるならべつだけど。 ちなみに、XML は Valid だよね。一応確認だけど。。。 「Undeclared entity」って描いてあるから、たぶんだけど、 HTML でつかえるからって、宣言してないエンティティー使っちゃってるとか?

hohoemikun
質問者

補足

ご回答ありがとうございます。 「妥当なXML」です。 その後、試しに&をすべて削ってみたところ、 最後まで正常に動作はしています。 それでエラー複数行のうち、 一番下行だけは消えましたが、 それ以外の上行複数のエラーは、 残ったままです。 宣言してないエンティティーを使っていないか? 確認いたしましたが、とくに使っていませんでした。 ところで私が質問時に情報として記述し忘れていましたが、 XMLファイルの文字エンコードはUTF-8を利用しています。 以上になります。 アドバイスやヒントだけでも構いませんので、 何か思い当たることがございましたら、 よろしくお願いします。

関連するQ&A

  • Unicode::Japanese を継承できない

    日本語の変換に関してUnicode::Japaneseを使った独自の処理を 実装しようとしているのですが、Unicode::Japaneseの継承が上手く いきません。 具体的には、、、 下記のようなTset.pmファイルを作成して試してみたところ //////////////////////////////////// package Test; use strict; use lib "./lib"; use Unicode::Japanese; our @ISA = qw ( Unicode::Japanese ); //////////////////////////////////// 次のようなエラーが出てしまいます。 Goto undefined subroutine &Extras::PurePerl::_init_table at common/perl/lib/Unicode/Japanese.pm line 222, <GEN0> line 1335. Unicode::Japanese中にUnicode::Japanese::PurePerlというものが あることのが原因と思うのですが、このようなモジュールを継承する にはどのようにしたらよいか分かりません。 どなたかご教示いただけませんでしょうか?

  • ワーニング? encoding.pm

    perlで以下のようなエラーが出るのですが、これを出ないようにするにはどうしたらよいのでしょうか? Constant subroutine DEBUG redefined at c:/usr/lib/encoding.pm line 8. Subroutine _exception redefined at c:/usr/lib/encoding.pm line 23. Subroutine in_locale redefined at c:/usr/lib/encoding.pm line 34. Subroutine _get_locale_encoding redefined at c:/usr/lib/encoding.pm line 36. Subroutine import redefined at c:/usr/lib/encoding.pm line 89. Subroutine unimport redefined at c:/usr/lib/encoding.pm line 156.

    • ベストアンサー
    • Perl
  • cpanからモジュールをインストール後

    お世話になります。 ネットで調べcpanからモジュールをインストールしました。 # su - # perl -MCPAN -e shell 最初の起動時に質問が出てきてリターンと少しの設定後、 cpan>install XML::RSS # find `perl -e 'print "@INC"'` -name 'RSS.pm' -print ./.cpan/build/XML-RSS-1.05/lib/RSS.pm ./.cpan/build/XML-RSS-1.05/blib/lib/XML/RSS.pm の形でインストールされているのを確認しました。 で、その後、perlのCGIの方で実行すると、 Can't locate XML/RSS.pm in @INC (@INC contains: ./mylib /usr/lib/perl5/5.8.0/i386-linux-thread-multi /usr/lib/perl5/5.8.0 /usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.0 /usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.0 /usr/lib/perl5/vendor_perl .) at rss.cgi line 10. BEGIN failed--compilation aborted at rss.cgi line 10. になってしまうんですが、次はどうすればよいのでしょうか

    • ベストアンサー
    • Perl
  • 添付ファイル保存perlの実行エラー

    お世話になります。 perl初心者です。 以下ののサイトから拾ってきたスクリプトを実行したところ、エラーがでて上手く実行されません。 http://www.jp-z.jp/perlmemo/parse_MIME-Parser_multipartmail.html ----- #!/usr/bin/perl use MIME::Parser; new MIME::Parser->parse(\*STDIN); ----- error message: Can't locate auto/Mail/Internet/autosplit.ix in @INC(@INC contains: C:/Perl/lib C:/Perl/site/lib .) at C:/Perl/lib/AutoLoader.pm line 100. at C:/Perl/lib/Mail/Internet.pm line 10 autosplit.ixが存在しないのかと思ったのですが、モジュールではないようなのでどうインストールするのかもよくわかりません。 詳しい方いらっしゃいましたらお助けください。。

  • perlを初めて使うのですが、ppmを使ってのインストールができません

    このたび初めてperlを使うのですが、コマンドプロンプトを起動し、ppmと打つと C:\Documents and Settings\自分の名前>ppm Fatal error: couldn't find or create config file targets.cfg: Cannot chdir back to C:/Documents and Settings/自分の名前: No such file or directory at C:/Perl/lib/ FindBin.pm line 182 BEGIN failed--compilation aborted at C:/Perl/lib/FindBin.pm line 188. Compilation failed in require at C:/Perl/site/lib/PPM/Config.pm line 444. BEGIN failed--compilation aborted at C:/Perl/site/lib/PPM/UI.pm line 1049. Compilation failed in require at C:\Perl\bin\ppm3-bin line 16. このような文章がでてきてしまい、インストールすることができませんでした。自分がインストールしようとしているのは install time-hires install io-zlib install win32-api install http-lite install getopt-long なのですが・・・ 自分なりにサイトを見てまわりましたが、確信にたどり着けず困り果てています。 どなたかご教授をお願いします。 PCの環境 OS: Windows XP Home Edition Perl: Active Perl 5.8.3.809 PPM : version 3.1

  • Net::SSH::Perlについて

    WindowsXPにActivePerlを導入し、Net::SSH::Perlを使用してLinuxサーバにssh接続をしたいのですが、どうもうまく動いてくれません。 ■ソース #!perl use Net::SSH::Perl; use strict; my $host = "192.168.1.250"; my $user = "test"; my $pass = "testtest"; my $cmd = "id"; my $ssh = Net::SSH::Perl->new($host); $ssh->login($user, $pass); my($stdout, $stderr, $exit) = $ssh->cmd($cmd); ■Windowsのコマンドプロンプトから実行すると Can't locate Math/Pari.pm in @INC (@INC contains: D:/add_program_files/perl/site/lib D:/add_program_files/perl/lib .) at D:/add_program_files/perl/lib/Net/SSH/Perl/Util/SSH2MP.pm line 6, <GEN0> line 1. BEGIN failed--compilation aborted at D:/add_program_files/perl/lib/Net/SSH/Perl/Util/SSH2MP.pm line 6, <GEN0> line 1. Compilation failed in require at D:/add_program_files/perl/lib/Net/SSH/Perl/Util.pm line 56, <GEN0> line 1. BEGIN failed--compilation aborted at D:/add_program_files/perl/lib/Net/SSH/Perl/Kex/DH1.pm line 10, <GEN0> line 1. Compilation failed in require at D:/add_program_files/perl/lib/Net/SSH/Perl/Kex.pm line 6, <GEN0> line 1. BEGIN failed--compilation aborted at D:/add_program_files/perl/lib/Net/SSH/Perl/Kex.pm line 6, <GEN0> line 1. Compilation failed in require at D:/add_program_files/perl/lib/Net/SSH/Perl/SSH2.pm line 6, <GEN0> line 1. BEGIN failed--compilation aborted at D:/add_program_files/perl/lib/Net/SSH/Perl/SSH2.pm line 6, <GEN0> line 1. Compilation failed in require at D:/add_program_files/perl/lib/Net/SSH/Perl.pm line 52, <GEN0> line 1. 上記を解決しようにも検索にHitせず、対処に困っています。 どなたか同じ境遇の人がいらっしゃったら教えてください。

  • ムーバブルタイプ3.2のBerkeleyDB⇒SQLへの移行について

    現在ロリポップでムーバブルタイプ3.2で新規にblogを作りました。 データ形式をはじめはBerkeleyDBで使用していたのですがSQLへ移行を行ないたいと思い以下のものを利用してみたのですが以下のエラーがでます。 http://as-is.net/wiki/MT_Database_Converter/ja mt-db-convert.cgi($Rev: 173 $): Converting your MT data between DB engines (for MT 3.2) **** WARNING: Subroutine Jcode::ucs2_euc redefined at extlib/Jcode/Unicode/NoXS.pm line 56. **** WARNING: Subroutine Jcode::euc_ucs2 redefined at extlib/Jcode/Unicode/NoXS.pm line 71. **** WARNING: Subroutine Jcode::euc_utf8 redefined at extlib/Jcode/Unicode/NoXS.pm line 87. **** WARNING: Subroutine Jcode::utf8_euc redefined at extlib/Jcode/Unicode/NoXS.pm line 94. **** WARNING: Subroutine Jcode::ucs2_utf8 redefined at extlib/Jcode/Unicode/NoXS.pm line 101. **** WARNING: Subroutine Jcode::utf8_ucs2 redefined at extlib/Jcode/Unicode/NoXS.pm line 124. どのような設定をすればSQLに移行できるのでしょうか?

  • @INCにrequireされたファイルが無い

    自作のCGIを実行したところ Can't locate BASE64 in @INC (@INC contains: C:/Perl/site/lib C:/Perl/lib .) at g etHTTP line 71. のようなエラーが出ます。 BASE64がインストールされているかどうか確認するために、次のサイトのcheck.cgiを実行してみました。 http://perl.shtml.jp/check/check.html インストールされているということなので、検索を掛けてBase64.pmのパスを調べました。 C:\Perl\lib\MIME そこで以下のコードを追加して実行しなおしました。 unshift @INC, "C:/Perl/lib/MIME"; 残念ながらうまく動きませんでした。 Can't locate BASE64 in @INC (@INC contains: C:/Perl/lib/MIME C:/Perl/site/lib C: /Perl/lib .) at getHTTP line 71. どうすれば良いでしょう。 お手数をお掛けします。

    • ベストアンサー
    • Perl
  • Expat.soが読めない!?

    XML::Parser 2.34 をインストールしました。 rootになれないレンタルサーバーですので、 ユーザーディレクトリ配下にインストールしました。 エラーは出ていません。 が、使用時に、 use XML::Parser; の行で下記エラーになります。 Can't load '/usr/home/USERNAME/perl/lib/i386-freebsd/auto/XML/Parser/Expat/Expat.so' for module XML::Parser::Expat: Shared object "libexpat.so.6" not found, required by "Expat.so" at /usr/…/DynaLoader.pm line 169. at /usr/home/USERNAME/perl/lib/i386-freebsd/XML/Parser.pm line 14 「DynaLoader.pm」は、システムのperlライブラリを参照してるようです。 もちろん-Iオプションで、 インストールしたライブラリパスを指定しています。 インストールは下記要領で、Expat-2.0.0からインストールしました。 <Expatのインストール> > ./configure --prefix=/usr/home/USERNAME/perl/lib > make > make install <XML::Parserのインストール> > perl Makefile.PL LIB=/usr/home/USERNAME/perl/lib EXPATLIBPATH=/usr/home/USERNAME/perl/lib/lib EXPATINCPATH=/usr/home/USERNAME/perl/lib/include INSTALLMAN1DIR=/usr/home/USERNAME/perl/lib/man1/ INSTALLMAN3DIR=/usr/home/USERNAME/perl/lib/man3/ > make > make install 気になるのが、Expatのconfigure実行後のMakefileで、  ifndef INSTALL_ROOT  INSTALL_ROOT=$(DESTDIR)  endif この部分がmake時にエラーになるのでコメントアウトしたことです。 INSTALL_ROOTは、--prefixで指定したディレクトリの前に付けて 使用しているので、無くて問題ないと判断したのですが…。 Expatのインストールに問題がある。というのは何となく分かるのですが、 どうすれば良いのかが分かりません。m(__)m perl 5.003です。

  • Mod_perl2.0が導入出来ない (ARP.dllに欠陥があるのでは)

    1586の者ですが、そこで具体的な回答を戴ける見込みが難しくなり、でもどうしても Mod_perl2.0を導入しないと自分の仕事が凍結してしまいますので、くどいかも しれませんが改めてサポートお願いさせていただきます。 その後、Mod_perl2.0をインストールし直してPerlでextra.plを以下URLの通りの内容で http://perl.apache.org/docs/2.0/os/win32/config.html 実行した所、今度こそうまく行って欲しいと思う願いも空しく、今度は以下別のエラー につまづきました。アパッチで起動しても閉じてしまいます。 C:\Apache2\conf>perl extra.pl Can't load 'C:/usr/local/site/lib/auto/APR/APR.dll' for module APR: load_file:こ のアプリケーションの実行に必要なライブラリ ファイルの 1 つが見つかりません。 at C:/usr/local/lib/DynaLoader.pm line 230. at C:/usr/local/site/lib/APR/Const.pm line 18 Compilation failed in require at C:/usr/local/site/lib/APR/Const.pm line 18. BEGIN failed--compilation aborted at C:/usr/local/site/lib/APR/Const.pm line 18. Compilation failed in require at extra.pl line 10. BEGIN failed--compilation aborted at extra.pl line 10. C:/usr/local/site/lib/auto/APR/APR.dllは有るにも関わらずロード出来ないんです。 正直、APR.dllにどこか欠陥があるのではしか感じられない状態です。 どうして、マニュアル通りに行ってもMod_perl2.0のセッティングが滞ってしまうのでしょうか? この通りです、Mod_perl2.0は自分の仕事に必要不可欠です。これがなければ食って行けません! どうかご回答宜しくお願いします。

    • ベストアンサー
    • Perl

専門家に質問してみよう