繁体   English   中英

解析XML时出现Ruby on Rails错误

[英]Ruby on Rails error when parsing XML

使用我的Ruby on Rails服务器解析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.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调用不会出错),并且,如果是这样,则它返回的数组中肯定有数据。

希望对您有所帮助-如有任何疑问,请与我们联系。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM