PerlでXMLデコードが失敗する問題の解決方法

このQ&Aのポイント
  • PerlでHTTPリクエストを送信し、XMLで返ってくるAPIを使用しています。しかし、日本語の返答にバックスラッシュが含まれるため、文字列のデコードに失敗しています。
  • デコードに失敗する場合、XML内のバックスラッシュを削除する方法はありますか?
  • 助けを求めます。
回答を見る
  • ベストアンサー

PerlでXMLがデコード出来ません。

いつもお世話になっております。 今回も質問させていただきます。 PerlでhttpリクエストをしてXMLで返ってくるapiを使っているのですが、 英語で返答が来る時にはバックスラッシュが入っておらず成功するのですが、 日本語で返答が来ると、バックスラッシュがxml内部に記述されて Cannot decode string with wide characters と怒られます。 my $http2 = get($trans_url); my $result2=XML::Simple->new()->XMLin($http2); use CGI::Carp qw(fatalsToBrowser); die Dumper $result2; とダンプすると 成功するとき <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">testtest</string> 失敗するとき <string xmlns=\"http://schemas.microsoft.com/2003/10/Serialization/\">\x{79c1}\x{306f}\x{65e5}\x{672c}\x{4eba}\x{3067}\x{3059}\x{3002}</string> と、明らかに「¥」が入っているときにデコードに失敗しているのですが、 このXMLの中の”の前の¥マークを取り除くことが出来ませんか? お知恵を拝借できればと思います。 どうぞよろしくお願いいたします。

  • Perl
  • 回答数1
  • ありがとう数2

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

  • ベストアンサー
  • t-okura
  • ベストアンサー率75% (253/335)
回答No.1

XMLin の前に $XML::Simple::PREFERRED_PARSER = 'XML::Parser'; としておくとよいようです。 また、XML::Simple utf8 でググると役立つ情報が多々あります。

参考URL:
http://d.hatena.ne.jp/sfujiwara/20090730/1248959524
strayhoneybee
質問者

お礼

有難うございます!解決いたしました!!

関連するQ&A

  • Activeperlのエラーメッセージ

    こんにちわ。 perlについては、勉強はじめたばかりで、 まだ、使い方になれてない段階です。 それでサンプルを見ながら勉強しようと考えていますが、 それさえも、うまくいかない状態です。 現在、日経ソフトウェアの”ずばりわかるWebプログラミング2.0”を見て勉強しようとしています。 http://itpro.nikkeibp.co.jp/article/MAG/20070410/267630/ 第1部のpart2のサンプルが動かなくて困っています。 本に載っているようにactiveperlやapacheのインストールをして、 それぞれ、本のように動作設定して、 サンプルにあるアプリケーションIDを設定して実行しましたがエラーが出て動きません。 どうしてでしょうか? 動かない箇所は次のところのようです。 サンプルプログラム #最初途中 略 # Assemble all options. my $option_string = join('&', @option_list); my $url = "${request_url}?${option_string}"; # Retrieve result. print STDERR "\$url = ${url}\n"; my $response_string = get($url); my $response_hashref = XMLin(\$response_string); #以下、略 で、my $response_hashref = XMLin(\$response_string);の行を実行したときに、以下のようなmessageが出るようです。 no element found at line 1, column 0, byte -1 at C:/Perl/lib/XML/Parser.pm line187 まだまだ、初心者でサンプルを実行しながら、感覚を磨いていこうと思っていますが、 本には説明されていないようなメッセージが出て困っています。 ぜひ、アドバイスをお願いします。 実行環境 Activeperl5.8.8 build820 Web Server Apache2.0.59

  • SQL ServerのXMLスキーマがうまくいきません。

    「SQL Server 2005 Express」を使用しています。 次のようなスキーマをサーバーに登録して CREATE XML SCHEMA COLLECTION dbo.schema_test AS N'<?xml version="1.0" encoding="UTF-16"?> <xsd:schema targetNamespace="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions" xmlns:xsd="http://www.w3.org/2001/XMLSchema" > <xsd:element name="root">  <xsd:complexType mixed="true">   <xsd:choice>    <xsd:element name="A" type="xsd:string" />    <xsd:element name="B" type="xsd:string" />    <xsd:element name="C" type="xsd:string" />   </xsd:choice>  </xsd:complexType> </xsd:element> </xsd:schema>' ; つぎのようなクエリを試したのですが、 「メッセージ 6913、レベル 16、状態 1、行 5 XML 検証: 要素 'root' の宣言が見つかりませんでした。場所: /*:root[1]」 というエラーメッセージが表示されてしまいます。 DECLARE @xml xml (dbo.schema_text) SET @xml = '<root> <A>AAA</A> <B>BBB</B> <C>ooo</C> </root> ' どなたか分かる方がいらっしゃいましたら、 アドバイスをお願いいたします。

  • ルート要素に指定しているxmlnsについて教えて下さい。

    「Visual Studio 2008」の評価版を使用しています。 下記の記述はプロジェクトを作成した時に作成されたXAMLファイルです。 ※デフォルトです。 <UserControl x:Class="_sample.Page"  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  Width="400" Height="300">  <Grid x:Name="LayoutRoot" Background="White">  </Grid> </UserControl> 「xmlns」と「xmlns:x」について教えて下さい。 「xmlns」・・・ XML名前空間 「xmlns:x」・・・ XAML言語の名前空間 下記のサイトに書いてありましたが・・・ http://msdn.microsoft.com/ja-jp/library/cc189036(VS.95).aspx#whatisxaml 私が知りたいのはこの「xmlns」と「xmlns:x」の属性は固定ですか。 ※固定というのはURLではありません。 くだらない質問かも知れませんがご教授、お願いします。 失礼します。

  • XMLの表示文字化け

     皆様  XMLをブラウザで表示させたときの文字化けで困っています。  もうちょっと詳細な話をしますと、あるアプリケーションの初期設定ファイル(以下、INI.XML)の挙動がおかしく、動作が不安定な状態になっております。  なお、このアプリケーションは.NETをプラットフォームにしています。  動作環境は、WindowsVista Business SP2(32bit)です。  INI.XML(文字コードはUTF-8)をメモ帳で開いた内容は、 ------------------------------------------------- <?xml version="1.0"?> <MyConfig> <Server> <Connect>Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=C:\広島\Abc.MDB</Connect> </Server> </MyConfig> ------------------------------------------------- こんな具合です。  このINI.XMLを、例えばc:\tmpというフォルダに入れ、ダブルクリックするとブラウザ(IE)でXMLの内容がずらっと表示されますが、表示内容はメモ帳の内容とほぼ同一です。  違いといえば、 ・\がバックスラッシュになる ・タグ等に色がつく といった程度です。  次に、このINI.XMLを件のアプリケーションが入っているフォルダ(例:C:\Program Files\システム)に入れて、ダブルクリックしてブラウザで表示させると、XMLソース中の「広島」が「三次」に化けてしまいます。  ブラウザ上の「C:\広島\Abc.MDB」部分(\は実際はバックスラッシュ)をコピーしてメモ帳に貼り付けると、「C:\三次\Abc.MDB」という文字列が入力されます。  しかし、ブラウザからソースを表示させると、正しく「広島」となっています。  面白いことに、INI.XMLをINI-.XMLという名前に変更してブラウザで表示させると、「広島」は「広島」のままです。  ブラウザのキャッシュをクリアしてみたりもしましたが、状況に変化はありません。レジストリで「三次」を検索しましたが、ヒットしません。  このアプリケーションがINI.XMLをそのままテキストで読み込めば問題ないのでしょうが、なぜかブラウザ表示内容で読み込むみたいで、化けた「三次」を読み込んでしまいます。  見てのとおりXMLの内容はデータベースへの接続文字列ですので、アプリケーションは見当違いのところへ接続しようとして、まともに動作しません。  アプリケーションを再インストールしても状況は同じです。  しかし、WindowsXP上では、この問題は発生しません。  何が問題なのでしょうか。よろしくご指導ください。

  • リロードボタンについて

    Java、xsl、xml を使ってリロードボタンを作成することになりました。 リロードとは現在のページにもう一回アクセスすることだと考え 下記のメソッドで現在のURLを取得 private String useUrl(HttpServletRequest request){ String result = ""; String useUrl = request.getRequestURI(); String getUrl = request.getQueryString(); if(getUrl == null){ getUrl = ""; } result = useUrl+getUrl; return result; } これを呼び出し、xmlに書き込み String URL = ""+useUrl(request); Element urlNode= document.createElement("URL"); contributeNode.appendChild(urlNode); urlNode.appendChild(document.createTextNode(URL)); のようにしてxmlに現在のURLを書き込むことには成功しているのですが 肝心のxslでの呼び出しがうまくいきません。 xslでしたいことは <xsl:attribute>タグを使用して呼び出すということです。 上記の段取りではできないものなのでしょうか?? アドバイスなどお願いします。 またカテ違いかもしれませんね、すいません。

    • ベストアンサー
    • Java
  • aspで別ドメインにあるXMLの読込み方

    質問させてください。 aspで下記のようなコードを書きXMLを別ドメインから読込もうとしたのですが読み込み出来ません。 これをサーバーマップパスで書いた同一ドメインから読込むと読み込む事が出来ます。 VBScriptではなくJScriptで同じような内容の呼び出しを試してみたのですが別ドメイン上にあるXMLの読込みは出来ませんでした。 色々ググってみたりしたのですが、これに関する記事が見つからなかりませんでした。 aspでは基本的に別ドメイン上にあるものは読込めないのでしょうか? 情報的に足りない事があれば出来るだけ書きますのでどうか解答していただければ助かります。 <% Set xmlDoc = Server.CreateObject("Microsoft.XMLDOM") xmlDoc.async = false If xmlDoc.Load("http://www.xxx/xxx/xxx.xml") Then Response.Write("ドキュメントの読み込みに成功しました。") temp = xmlDoc.text Else Response.Write("ドキュメントに読み込みに失敗しました。") End If Set xDoc = Nothing %>

  • JQueryでXML検索

    お世話になります。 blue-horse と申します。 JQueryでXML文書の検索・抽出を行おうとしています。 が、フィルタが上手く行きません。 どこがどうおかしいのでしょうか。 ご教示ください。 参考になるサイト等も教えて頂ければありがたいです。 [XML例] <?xml version='1.0' encoding='UTF-8'?> <xml_recordset>   <record>     <field_A>北海道</field_A>     <field_B>北海道</field_B>     <field_C>札幌市</field_C>   </record>   <record>     <field_A>青森</field_A>     <field_B>東北</field_B>     <field_C>青森市</field_C>   </record>   <record>     <field_A>秋田</field_A>     <field_B>東北</field_B>     <field_C>秋田市</field_C>   </record>   <record>     <field_A>岩手</field_A>     <field_B>東北</field_B>     <field_C>盛岡市</field_C>   </record>   <record>     <field_A>山形</field_A>     <field_B>東北</field_B>     <field_C>山形市</field_C>   </record>   <record>     <field_A>宮城</field_A>     <field_B>東北</field_B>     <field_C>仙台市</field_C>   </record>   <record>     <field_A>福島</field_A>     <field_B>東北</field_B>     <field_C>福島市</field_C>   </record> </xml_recordset> [JavaScript] // JQueryは読み込み済みです var my_xml = get_xml(); //自作関数,XMLを取得,動作確認済み $my_record = $(my_xml).find("field_B"); alert($my_record.length); //成功,7が表示されます $tohoku = $(my_xml).find("field_B:contains('東北')"); alert($tohoku.length); //失敗,何も表示されません(6が表示されることを期待)

  • 弥生ドライブが起動しません

    弥生販売15プロフェッショナルを使用しています。 ある日突然、弥生ドライブが起動しなくなりました。 いろいろと調べてみたところ以下のログが出てきました。 - ファイルのシリアライズ/デシリアライズ処理中にエラーが発生しました。 System.InvalidOperationException: XML ドキュメント (0,0) でエラーが発生しました。 ---> System.Xml.XmlException: ルート要素が見つかりません。 場所 System.Xml.XmlTextReaderImpl.Throw(Exception e) 場所 System.Xml.XmlTextReaderImpl.ThrowWithoutLineInfo(String res) 場所 System.Xml.XmlTextReaderImpl.ParseDocumentContent() 場所 System.Xml.XmlTextReaderImpl.Read() 場所 System.Xml.XmlTextReader.Read() 場所 System.Xml.XmlReader.MoveToContent() 場所 Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderYDUserFile.Read6_LoginUser() --- 内部例外スタック トレースの終わり --- 場所 System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events) 場所 System.Xml.Serialization.XmlSerializer.Deserialize(Stream stream) 場所 Yayoi.Drive.Client.Common.SerializeUtility.Deserialize[T](String path) 2015/03/31 10:09:17 [FATAL] (1_70) - 弥生ドライブの起動中にエラーが発生しました。 System.NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません。 場所 Yayoi.Drive.Client.Presentation.Command.StartProcess.CheckMypageIdCustId() 場所 Yayoi.Drive.Client.Presentation.Command.StartProcess.IsUserGuideShow() 場所 Yayoi.Drive.Client.Presentation.Command.StartProcess.Execute(Object parameter) 場所 Yayoi.Drive.Client.Application.App.Application_Startup(Object sender, StartupEventArgs e) 午前中は問題ありませんでしたが、午後に異常となりました。 その間、PCのアップデートなどは行ってません。 何が原因か全く解らず困っています。

  • Ajax:getElementsByTagNameで取得できない

    Ajaxでプログラミングをしております。 サーバに問い合わせた答えをXMLで返しております。 Ajaxで問い合わせて、 alert(req.responseText); とすれば、XMLが画面に表示されて、答えが返っていることを確認できています。 ====XMLデータは以下=== <?xml version="1.0" encoding="utf-8" ?> - <results> - <result> <x>139.1748046875</x> <y>37.26530995561875</y> <kiji>トラックバックテスト</kiji> <url>http://blog.livedoor.jp/***/archives/50669333.html</url> <contents>test trackbackAAAAAAAAAAAAAAAAAAAA</contents> <btitle>必勝!株式投資!</btitle> <date>10.24.06</date> </result> - <result> <x>139.1748046875</x> <y>37.26530995561875</y> <kiji>下げシグナル</kiji> <url>http://blog.livedoor.jp/***/archives/50533401.html</url> <contents>カブログへの清き一票よろしくお願いします </contents> <btitle>必勝!株式投資!</btitle> <date>2006.10.24</date> </result> </results> ====ここまで===== XMLの<result>タグでブロックごとに分解し、その分解されたブロックから <X>の値、<contents>の値を取ろうとしております。 ためしに、 var result = req.responseXML.getElementsByTagName('result'); alert(result.length); とやって、<result>タグで2ブロックにきれているか、確かめたのですが、 0と返ってきます。 何かやり方がわるいのでしょうか? サーバプログラム、クライアントプログラムとも、UTF-8でやってます。 IEは6.0です。 よろしくお願いします。

  • RSSのXMLロードで失敗してしまう

    RSSのデータを取得する、という処理を行いたいのですが、 文字コードの件でひっかかってしまっているようで なかなか前に進むことができません。 ************ // RSSの内容を取得する $rss_text = file_get_contents(※RSSのフィードURL); // RSSの文字エンコーディングを変換→再変換 $rss_text = mb_convert_encoding($rss_text, 'SJIS', 'UTF-8'); $rss_text = mb_convert_encoding($rss_text, 'UTF-8', 'SJIS'); $rss_text = preg_replace('/[\x00-\x1f]/', '', $rss_text); // RSSをパースする $rss_xml = new SimpleXMLElement($rss_text); if ($rss_xml) { // XML解析に成功した場合 // SimpleXMLElementオブジェクトからデータを取得 $items = $rss_xml->item; foreach($items as $item) { echo 'ID:'. $item->guid. '<br />'; echo 'リンク:'. $item->link. '<br />'; echo '日付:'. $item->pubDate. '<br />'; echo 'タイトル:'. $item->title. '<br />'; echo '本文:'. $item->description. '<br />'; } } ************ こういったコードを組んでいるのですが、現状では Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 1: parser error : attributes construct error in... Warning: simplexml_load_string() [function.simplexml-load-string]: ^ in... Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 1: parser error : Couldn't find end of Start Tag rss line 1 in... Warning: simplexml_load_string() [function.simplexml-load-string]: ^ in... Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 1: parser error : Extra content at the end of the document in... Warning: simplexml_load_string() [function.simplexml-load-string]: ^ in... このようなエラーが表示されてしまいます。 自分なりに文字コードを処理しているつもりではあるのですが、 他にも何かしなければならないことがあるのでしょうか? どうぞ知恵を貸していただければと思います。 よろしくお願いいたします。

    • ベストアンサー
    • PHP

専門家に質問してみよう