1

我写了这个小程序:

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

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

 <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"/>

但不知何故,我得到了这个错误:

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

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

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

4

2 回答 2

1

方法内部

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

nil:NilClass(NoMethodError)的错误未定义方法 'von='表示当时node名称是'von_icd_code',而不是'nummer'。这就是为什么if node.node_name.eql? 'nummer'评估为false. 但是在 Ruby 中,局部变量是在解析时创建的,每当遇到任何这样的赋值语句tmp_kapitel = Kapitel.newflaseif node.node_name.eql? 'nummer'就像,。并且没有调用任何方法,因此向您抛出了合法错误。tmp_kapitelnilKapitel.newNilClass#von

于 2013-09-09T13:26:41.790 回答
0
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

哪个输出:

[
    [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>
]

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

puts doc.to_xml

我们看到它添加了结束标签。

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

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

于 2013-09-09T16:58:45.157 回答