2008-09-15 2 views
2

Ruby on RailsアプリケーションでWebページからXMLファイルをインポートしようとしています。コードルビのコードは次のとおりです(HTMLレイアウトを削除しました)簡単にコードを読むようにするタグ)を次のHTML形式でRailsアプリ、UTF-16エンコーディングでXMLファイルをインポートする

<% form_for(:fmfile, :url => '/fmfiles', :html => { :method => :post, :name => 'Form_Import_DDR', :enctype => 'multipart/form-data' }) do |f| %> 
<%= f.file_field :document, :accept => 'text/xml', :name => 'fmfile_document' %> 
<%= submit_tag 'Import DDR' %> 
<% end %> 

結果

<form action="/fmfiles" enctype="multipart/form-data" method="post" name="Form_Import_DDR"><div style="margin:0;padding:0"><input name="authenticity_token" type="hidden" value="3da97372885564a4587774e7e31aaf77119aec62" /> 
<input accept="text/xml" id="fmfile_document" name="fmfile_document" size="30" type="file" /> 
<input name="commit" type="submit" value="Import DDR" /> 
</form> 

「fmfiles_controller」でForm_Import_DDR方法はでXML文書を読み込むのハードワークを行うコードでありますREXMLを使用します。

@fmfile = Fmfile.new 
@fmfile.user_id = current_user.id 
@fmfile.file_group_id = 1 
@fmfile.name = params[:fmfile_document].original_filename 

respond_to do |format| 
    if @fmfile.save 
    require 'rexml/document' 
    doc = REXML::Document.new(params[:fmfile_document].read) 

    doc.root.elements['File'].elements['BaseTableCatalog'].each_element('BaseTable') do |n| 
     @base_table = BaseTable.new 
     @base_table.base_table_create(@fmfile.user_id, @fmfile.id, n) 
    end 

そして、それは内のすべての異なるXML要素を読み込むに運ぶを次のようにコードがある。

私は、Mac OS X 10.5上での開発環境でのRails 2.1.0と雑種1.1.5を使用しています。 4、サイトDBと同じマシン上のブラウザ。

私の質問はこれです。 XMLファイルがUTF-8でエンコードされているXMLドキュメントを読み込んだときに、このプロセス全体が正常に動作しますが、XMLファイルがUTF-16のときに失敗します。なぜこれが起こっているのか、

私は以下のデバッガコンソールからのエラー出力が含まれている「のページを開くことができませんでした」で、それは次のように出力する前に、この出力とブラウザの時間を取得するのに約5分かかり

むしろ
Processing FmfilesController#create (for 127.0.0.1 at 2008-09-15 16:50:56) [POST] 
Session ID: BAh7CDoMdXNlcl9pZGkGOgxjc3JmX2lkIiVmM2I3YWU2YWI4ODU2NjI0NDM2 
NTFmMDE1OGY1OWQxNSIKZmxhc2hJQzonQWN0aW9uQ29udHJvbGxlcjo6Rmxh 
c2g6OkZsYXNoSGFzaHsABjoKQHVzZWR7AA==--dd9f588a68ed628ab398dd1a967eedcd09e505e0 
Parameters: {"commit"=>"Import DDR", "authenticity_token"=>"3da97372885564a4587774e7e31aaf77119aec62", "action"=>"create", "fmfile_document"=>#<File:/var/folders/LU/LU50A0vNHA07S4rxDAOk4E+++TI/-Tmp-/CGI.3001.1>, "controller"=>"fmfiles"} 
[4;36;1mUser Load (0.000350)[0m [0;1mSELECT * FROM "users" WHERE (id = 1) LIMIT 1[0m 
[4;35;1mFmfile Create (0.000483)[0m [0mINSERT INTO "fmfiles" ("name", "file_group_id", "updated_at", "report_created_at", "report_link", "report_version", "option_on_open_account_name", "user_id", "option_default_custom_menu_set", "option_on_close_script", "path", "report_type", "option_on_open_layout", "option_on_open_script", "created_at") VALUES('TheTest_fp7 2.xml', 1, '2008-09-15 15:50:56', NULL, NULL, NULL, NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, '2008-09-15 15:50:56')[0m 

REXML::ParseException (#<Iconv::InvalidCharacter: "਼䙍偒数 (followed by a few thousand similar looking chinese characters) 
䙍偒数潲琾", ["\n"]> 
/Library/Ruby/Site/1.8/rexml/encodings/ICONV.rb:7:in `conv' 
/Library/Ruby/Site/1.8/rexml/encodings/ICONV.rb:7:in `decode' 
/Library/Ruby/Site/1.8/rexml/source.rb:50:in `encoding=' 
/Library/Ruby/Site/1.8/rexml/parsers/baseparser.rb:210:in `pull' 
/Library/Ruby/Site/1.8/rexml/parsers/treeparser.rb:21:in `parse' 
/Library/Ruby/Site/1.8/rexml/document.rb:190:in `build' 
/Library/Ruby/Site/1.8/rexml/document.rb:45:in `initialize' 

答えて

1

rails/mongrelの問題よりも、XMLファイルやREXMLの処理方法に問題がある可能性が高いと言えます。これを確認するには、XMLファイルを直接(要求内ではなく)読み込み、まだ失敗しているかどうかを確認する短いスクリプトを記述します。

と仮定すると、私が見ていることがいくつかあります。まず、REXMLの最新バージョンを実行していることを確認します。数年前、UTF-16処理にバグ(http://www.germane-software.com/projects/rexml/ticket/63)がありました。

問題がある場合は、http://groups.google.com/group/rubyonrails-talk/browse_thread/thread/ba7b0585c7a6330dに尋ねると2番目のことがあります。その場合は、そのスレッドで回避策を試すことができます。

上記のいずれにも該当しない場合は、ファイルを読み込んだり読み込んだりするなど、詳細な情報を返信してください。

+0

あなたのお返事ありがとうございます、私はあなたが提案したものを試してみましょう、そしてどこにもいなければ再投稿します –

0

これを実現するには、最初のXML要素のエンコーディング属性をUTF-16ではなくUTF-8に変更する必要があるため、XMLファイルは実際にはUTF-8であり、アプリケーションによって誤ってラベル付けされますそれを生成する。

XMLファイルOS X 10.5.4上のFileMaker Pro Advancedの8.5によって生成FileMakerのDDRの輸出は

+0

以下の私の答えを見てください。私も同様の問題がありました。 –

0

あなたはJRubyのを使用してこれをやってみましたか?私は、Unicode文字列がJRubyでよりよくサポートされていると聞いてきました。

他にも、libxml ou Hpricotなどの別のXML解析ライブラリを使用することもできます。

REXMLは、使用することができる最も低速のRuby XMLライブラリの1つで、縮尺を調整することはできません。

0

実際、あなたの問題は、ちょうどthis postで詳述された問題に関連していると思います。私があなたの場合は、バイナリモードでTextPadで開き、XMLが始まる前にバイトオーダーマークがあるかどうかを確認します。

+0

ありがとう、私はそれを調べます –

関連する問題