Ruby on Rails 解析 XML 时出错
Ruby on Rails error when parsing XML
我现在在 Rails 服务器上使用我的 Ruby 解析 XML 时遇到此错误:
ERROR -- : exception while processing events: undefined method
`content' for nil:NilClass Backtrace
-- /var/www/distribution/distribution-server/app/models/upload_action.rb:23:in `block in upload'
-- /var/www/distribution/distribution-server/app/models/upload_action.rb:14:in `each'
-- /var/www/distribution/distribution-server/app/models/upload_action.rb:14:in `upload'
-- /var/www/distribution/distribution-server/app/services/run_listener.rb:8:in `block in start'
相关代码:
def self.upload(xml_files)
actions = []
xml_files.each do |xml_file|
if File.exist?(xml_file)
doc = File.open(xml_file) { |f| Nokogiri::XML(f) }
action = UploadAction.new
action.file_name = [doc.xpath("//field[@index='103']").first.content]
action.content_provider_name = doc.xpath("//field[@index='45']").first.content
action.content_provider_title = doc.xpath("//field[@index='24']").first.content
action.created_date = doc.xpath("//field[@index='13']").first.content.to_date
action.credit_line = doc.xpath("//field[@index='91']").first.content
错误发生在'action'、action.content_provider_name的第三行。 XML 中的所有必填字段均已正确填写。如果我将 doc.xpath("//field[@index='45']").first.content
更改为字符串,例如 'Example String',则 action.content_provider_title 会出错。
编辑
XML 个字段的部分示例:
`<metadata>
<field index="24" type="picklist"
name="content_provider_title">title</field>
<field index="45" type="picklist"
name="content_provider_name">name</field>
<field index="79" type="text" name="Monitor State">Restored</field>
<field index="81" type="checkbox" name="Confirm Delete">false</field>
</metadata>`
根据您使用的 Rails 版本,您可以将以下行更改为其下面的选项之一:
action.file_name = [doc.xpath("//field[@index='103']").first.content]
更新到:
action.file_name = [doc.xpath("//field[@index='103']").first&.content]
# or
action.file_name = [doc.xpath("//field[@index='103']").first.try(:content)]
这两个选项都可以防止 NilClass
错误。如果您不一定需要 action.file_name
的值,这将修复错误。
否则,这是确保选择器 (doc.xpath("//field[@index='103']")
) 绝对正确的情况(看起来是正确的,因为您在调用 first
时没有收到错误消息),如果是这样,数组中肯定有数据 returns.
希望对您有所帮助 - 如果您有任何问题,请告诉我。
我现在在 Rails 服务器上使用我的 Ruby 解析 XML 时遇到此错误:
ERROR -- : exception while processing events: undefined method
`content' for nil:NilClass Backtrace
-- /var/www/distribution/distribution-server/app/models/upload_action.rb:23:in `block in upload'
-- /var/www/distribution/distribution-server/app/models/upload_action.rb:14:in `each'
-- /var/www/distribution/distribution-server/app/models/upload_action.rb:14:in `upload'
-- /var/www/distribution/distribution-server/app/services/run_listener.rb:8:in `block in start'
相关代码:
def self.upload(xml_files)
actions = []
xml_files.each do |xml_file|
if File.exist?(xml_file)
doc = File.open(xml_file) { |f| Nokogiri::XML(f) }
action = UploadAction.new
action.file_name = [doc.xpath("//field[@index='103']").first.content]
action.content_provider_name = doc.xpath("//field[@index='45']").first.content
action.content_provider_title = doc.xpath("//field[@index='24']").first.content
action.created_date = doc.xpath("//field[@index='13']").first.content.to_date
action.credit_line = doc.xpath("//field[@index='91']").first.content
错误发生在'action'、action.content_provider_name的第三行。 XML 中的所有必填字段均已正确填写。如果我将 doc.xpath("//field[@index='45']").first.content
更改为字符串,例如 'Example String',则 action.content_provider_title 会出错。
编辑
XML 个字段的部分示例:
`<metadata>
<field index="24" type="picklist"
name="content_provider_title">title</field>
<field index="45" type="picklist"
name="content_provider_name">name</field>
<field index="79" type="text" name="Monitor State">Restored</field>
<field index="81" type="checkbox" name="Confirm Delete">false</field>
</metadata>`
根据您使用的 Rails 版本,您可以将以下行更改为其下面的选项之一:
action.file_name = [doc.xpath("//field[@index='103']").first.content]
更新到:
action.file_name = [doc.xpath("//field[@index='103']").first&.content]
# or
action.file_name = [doc.xpath("//field[@index='103']").first.try(:content)]
这两个选项都可以防止 NilClass
错误。如果您不一定需要 action.file_name
的值,这将修复错误。
否则,这是确保选择器 (doc.xpath("//field[@index='103']")
) 绝对正确的情况(看起来是正确的,因为您在调用 first
时没有收到错误消息),如果是这样,数组中肯定有数据 returns.
希望对您有所帮助 - 如果您有任何问题,请告诉我。