2

Ruby on RailsアプリケーションのWebページを介してXMLファイルをインポートしようとしています。コードのrubyビューコードは次のとおりです(コードを読みやすくするためにHTMLレイアウトタグを削除しました)

<% 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 %>

次のHTMLフォームの結果

<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メソッドは、REXMLを使用してXMLドキュメントを読み取るという大変な作業を行うコードです。コードは次のとおりです

@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.4の開発環境、サイトDB、同じマシンのブラウザでRails2.1.0とMongrel1.1.5を使用しています。

私の質問はこれです。このプロセス全体は、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'
4

4 に答える 4

1

rails/mongrel の問題ではなく、XML ファイルまたは REXML の処理方法に問題がある可能性が高いようです。XML ファイルを (リクエスト内ではなく) 直接読み取る短いスクリプトを作成し、それでも失敗するかどうかを確認することで、これを確認できます。

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

2 番目に確認することは、問題がhttp://groups.google.com/group/rubyonrails-talk/browse_thread/thread/ba7b0585c7a6330dに似ているかどうかです。その場合は、そのスレッドで回避策を試すことができます。

上記のいずれでも解決しない場合は、ファイルを読み取ろうとしたときに発生する例外など、詳細を返信してください。

于 2008-09-15T15:42:30.013 に答える
0

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

XMLファイルは、OSX10.5.4上のFileMakerProAdvanced8.5によって生成されたFileMakerDDRエクスポートです。

于 2008-09-15T18:02:12.860 に答える
0

JRuby を使用してこれを試してみましたか? JRuby では Unicode 文字列がより適切にサポートされていると聞いたことがあります。

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

REXML は、使用できる Ruby XML ライブラリの中で最も遅く、スケーリングできない可能性があります。

于 2008-11-04T16:53:52.393 に答える
0

実際、あなたの問題は、この投稿で説明した問題に関連している可能性があると思います。私があなただったら、バイナリ モードの TextPad でそれを開き、XML が始まる前にバイト オーダー マークがあるかどうかを確認します。

于 2008-11-14T21:23:36.113 に答える