解析使用 camt_parser rails gem 上传的 xml

Parse a xml uploaded with camt_parser rails gem

我在 rails 应用程序中安装了 camt_parser gem。 我的目标是上传和解析 camt_file (.xml).

当我以这种方式从本地文件解析时,它工作得很好:

require 'camt_parser'
require 'camt'
camt = CamtParser::File.parse 'CAMT053_140518.xml'
puts camt.group_header.creation_date_time
camt.statements.each do |statement|
    statement.entries.each do |entry|
        # Access individual entries/bank transfers
     #   puts "->"
     puts entry.description
     puts entry.debit
     p entry.transactions[0].iban
     p entry.transactions[0].transaction_id
     puts entry.transactions[0].debitor.iban
    end
end

但是当我尝试使用以下代码将其作为文件从我的视图上传时:

<%= form_tag '/patient_page/import_camt', :multipart => true do %>
    <label for="file">Upload text File</label> <%= file_field_tag "file" %>
    <%= submit_tag %>
<% end %>

对应方法:

def import_camt
    uploaded_file = params[:file]
    parsed_file = uploaded_file.read
    camt = CamtParser::File.parse uploaded_file
    puts camt.group_header.creation_date_time
    camt.statements.each do |statement|
        statement.entries.each do |entry|

        puts entry.description
        puts entry.debit
        p entry.transactions[0].iban
        p entry.transactions[0].transaction_id
        puts entry.transactions[0].debitor.iban
        end
    end
  end

我收到以下错误

"no implicit conversion of ActionDispatch::Http::UploadedFile into String" 在我尝试解析上传文件时的那一行。

有什么提示吗?

谢谢!

CamtParser::File.parse 需要文件路径,但您传递的是 ActionDispatch::Http::UploadedFile 对象。

当您在 rails 中上传文件时,该文件被包裹在 ActionDispatch::Http::UploadedFile 的实例中。要访问文件本身,有一个名为 tempfile.

的属性

这将 return Tempfile 表示正在上传的实际文件。 Tempfile 有一个 path 方法,它是文件本身的路径,因此由于 CamtParser::File.parse 需要一个文件路径,它可以按如下方式调用

CamtParser::File.parse(uploaded_file.tempfile.path) 

CamtParser 也有一个 String class 可以解析适当的字符串,因此您可以将其称为

CamtParser::String.parse(uploaded_file.read)

这是有效的,因为 ActionDispatch::Http::UploadedFile 公开了方法 read,这与调用 uploaded_file.tempfile.read

相同