为什么我得到“未定义的方法 `von=' for nil:NilClass"? [英] Why do I get "undefined method `von=' for nil:NilClass"?

查看:49
本文介绍了为什么我得到“未定义的方法 `von=' for nil:NilClass"?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我写了这个小程序:

需要'open-uri'需要'nokogiri'课堂知识attr_accessor :von, :bis, :bezeichnung结尾类子资本attr_accessor :von, :bis, :bezeichnung结尾定义解析文件doc = Nokogiri::XML(File.open("test.xml"))parse_xml(文档)结尾def parse_xml(doc)doc.root.elements.each 做 |node|parse_kapitel(节点)结尾结尾def parse_kapitel(节点)如果 node.node_name.eql?'数字'tmp_kapitel = Kapitel.new结尾如果 node.node_name.eql?'组'tmp_kapitel = SubKapitel.new结尾tmp_kapitel.von = node['V'] 如果 node.node_name.eql?'von_icd_code'tmp_kapitel.bis = node['V'] 如果 node.node_name.eql?'bis_icd_code'结尾放置 parse_file

使用它,我解析这个 XML 文件:

 <nummer V="1"/><von_icd_code V="A00"/><bis_icd_code V="B99"/><bezeichnung V="Bestimmte infektiöse und parasitäre Krankheiten"/><gruppen_liste><小组><von_icd_code V="A00"/><bis_icd_code V="A09"/><bezeichnung V="Infektiöse Darmkrankheiten"/><diagnosen_liste><诊断><icd_code V="A00.-"/><bezeichnung V="霍乱"/><abrechenbar V="n"/>

但不知何故我收到此错误:

 test.rb:32:in `parse_kapitel': undefined method `von=' for nil:NilClass(NoMethodError)

我认为问题在于 von-icd-code 在 XML 文档中出现了两次.

有人能帮我解决这个问题吗?

解决方案

require 'nokogiri'doc = Nokogiri::XML(' <kapitel><nummer V="1"/><von_icd_code V="A00"/><bis_icd_code V="B99"/><bezeichnung V="Bestimmte infektise und parasitre Krankheiten"/>FFC3\U+FFA4re Krankheiten"/><gruppen_liste><小组><von_icd_code V="A00"/><bis_icd_code V="A09"/><bezeichnung V="Infektise Darmkrankheiten"/>krankheiten"/><diagnosen_liste><诊断><icd_code V="A00.-"/><bezeichnung V="霍乱"/><abrechenbar V="n"/>')文档错误

哪些输出:

<预><代码>[[0] #<Nokogiri::XML::SyntaxError: 标签诊断第 12 行数据过早结束>,[1] #<Nokogiri::XML::SyntaxError: 标签diagnosn_liste line 11中的数据过早结束>,[2] #<Nokogiri::XML::SyntaxError: tag gruppe line 7中的数据过早结束>,[3] #<Nokogiri::XML::SyntaxError: tag gruppen_liste line 6中的数据过早结束>,[4] #<Nokogiri::XML::SyntaxError: tag kapitel line 1中的数据过早结束>]

如果我们看看 Nokogiri 必须做什么来修复 XML:

放入 doc.to_xml

我们看到它添加了结束标记.

<资本><nummer V="1"/><von_icd_code V="A00"/><bis_icd_code V="B99"/><bezeichnung V="Bestimmte infektise und parasitre Krankheiten"/><gruppen_liste><小组><von_icd_code V="A00"/><bis_icd_code V="A09"/><bezeichnung V="Infektise Darmkrankheiten"/><diagnosen_liste><诊断><icd_code V="A00.-"/><bezeichnung V="霍乱"/><abrechenbar V="n"/></diagnose></diagnosen_liste></gruppe></gruppen_liste></kapitel>

对于这个 XML,它能够正确执行此操作,但是在格式错误的 XML 或具有更复杂数据的 XML 中,它可能无法很好地执行此操作.并且,到那时,对生成的 DOM 进行的任何后续工作都值得怀疑.

I wrote this little program:

require 'open-uri'
require 'nokogiri'

class Kapitel
  attr_accessor :von, :bis, :bezeichnung
end

class SubKapitel
  attr_accessor :von, :bis, :bezeichnung
end

def parse_file 
  doc = Nokogiri::XML(File.open("test.xml"))
  parse_xml(doc)
end

def parse_xml(doc)
  doc.root.elements.each do |node|
    parse_kapitel(node)
  end
end

def parse_kapitel(node)
  if node.node_name.eql? 'nummer'
    tmp_kapitel = Kapitel.new 
  end
  if node.node_name.eql? 'gruppe'
    tmp_kapitel = SubKapitel.new
  end
  tmp_kapitel.von = node['V'] if node.node_name.eql? 'von_icd_code'
  tmp_kapitel.bis = node['V'] if node.node_name.eql? 'bis_icd_code'
end

puts parse_file

Using that, I parse this XML file:

 <kapitel>
      <nummer V="1"/>
      <von_icd_code V="A00"/>
      <bis_icd_code V="B99"/>
      <bezeichnung V="Bestimmte infektiöse und parasitäre Krankheiten"/>
      <gruppen_liste>
        <gruppe>
          <von_icd_code V="A00"/>
          <bis_icd_code V="A09"/>
          <bezeichnung V="Infektiöse Darmkrankheiten"/>
          <diagnosen_liste>
            <diagnose>
              <icd_code V="A00.-"/>
              <bezeichnung V="Cholera"/>
              <abrechenbar V="n"/>

But somehow I get this error:

 test.rb:32:in `parse_kapitel': undefined method `von=' for nil:NilClass(NoMethodError)

I think the problem is that von-icd-code appears twice in the XML document.

Can somebody help me to solve this problem?

解决方案

require 'nokogiri'
doc = Nokogiri::XML(' <kapitel>
      <nummer V="1"/>
      <von_icd_code V="A00"/>
      <bis_icd_code V="B99"/>
      <bezeichnung V="Bestimmte infektise und parasitre Krankheiten"/>FFC3\U+FFA4re Krankheiten"/>
      <gruppen_liste>
        <gruppe>
          <von_icd_code V="A00"/>
          <bis_icd_code V="A09"/>
          <bezeichnung V="Infektise Darmkrankheiten"/>krankheiten"/>
          <diagnosen_liste>
            <diagnose>
              <icd_code V="A00.-"/>
              <bezeichnung V="Cholera"/>
              <abrechenbar V="n"/>')

doc.errors

Which outputs:

[
    [0] #<Nokogiri::XML::SyntaxError: Premature end of data in tag diagnose line 12>,
    [1] #<Nokogiri::XML::SyntaxError: Premature end of data in tag diagnosen_liste line 11>,
    [2] #<Nokogiri::XML::SyntaxError: Premature end of data in tag gruppe line 7>,
    [3] #<Nokogiri::XML::SyntaxError: Premature end of data in tag gruppen_liste line 6>,
    [4] #<Nokogiri::XML::SyntaxError: Premature end of data in tag kapitel line 1>
]

If we look at what Nokogiri had to do to fix-up the XML:

puts doc.to_xml

We see that it added closing tags.

<?xml version="1.0"?>
<kapitel>
      <nummer V="1"/>
      <von_icd_code V="A00"/>
      <bis_icd_code V="B99"/>
      <bezeichnung V="Bestimmte infektise und parasitre Krankheiten"/>
      <gruppen_liste>
        <gruppe>
          <von_icd_code V="A00"/>
          <bis_icd_code V="A09"/>
          <bezeichnung V="Infektise Darmkrankheiten"/>
          <diagnosen_liste>
            <diagnose>
              <icd_code V="A00.-"/>
              <bezeichnung V="Cholera"/>
              <abrechenbar V="n"/></diagnose></diagnosen_liste></gruppe></gruppen_liste></kapitel>

It was able to do so correctly for this XML, but in XML that is malformed, or has more complicated data it might not do as well. And, at that point, any subsequent work on the resulting DOM would be suspect.

这篇关于为什么我得到“未定义的方法 `von=' for nil:NilClass"?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆