SAX-разбор с ошибкой элемента Nokogiri? - PullRequest
0 голосов
/ 02 апреля 2012

У меня есть пара сотен файлов XML, как показано ниже.Я хочу проанализировать их с помощью SAX и сохранить содержимое между всеми тегами и сохранить их в хешах.

Это фрагмент XML-файла:

<titles>
 <title xml:lang="sv">Arkivvetenskap</title>
 <title xml:lang="en">Archival science</title>
</titles>
<descriptions>
 <ct:description xml:lang="sv">
  <ct:text>Arkivvetenskap rör villkoren för befintliga arkiv och modern arkivbildning med  
   fokus på arkivarieyrkets arbetsuppgifter: bevara, tillgängliggöra och styra information. 
   Under ett år behandlas bl a informations- och dokumenthantering, arkivredovisning, 
   gallring, lagstiftning och arkivteori. I kursen ingår praktik, där man under handledning  
   får arbeta med olika arkivarieuppgifter.
  </ct:text>
 </ct:description>
</descriptions>
</educationInfo>

Полный XML выглядит следующим образом: https://gist.github.com/2282103

У меня есть следующий код:

require 'rubygems'
require 'nokogiri'
require 'ap'
include Nokogiri

class Fish < Nokogiri::XML::SAX::Document

   def initialize
      @f = {}
      @f["titles"] = Array.new([])
      @f["descriptions"] = Array.new([])
      @desc = {}      
   end

   def start_element(element, attributes = [])
      @element = element
      @desc = {} if element == "ct:description xml:lang='sv'"
   end

   def end_element(element, attributes = [])
      @f["titles"] << @characters if element == "title xml:lang='sv'" 
      @f["titles"] << @characters if element == "title xml:lang='en'" 
      if element == "ct:text"
         @desc["edutext"] = @characters 
         @f["descriptions"] << @desc
      end
   end

   def characters(string)
      @characters = string
   end

   def end_document
      ap @f
      puts "Finished..."
   end

end
#Create a parser
parser = Nokogiri::XML::SAX::Parser.new(Fish.new)
# Feed the parser some XML
parser.parse(File.open("arkivvetenskap.xml", 'rb'))

Элемент в файлах XML, которые я хочу сохранить, не сохраняется в хешах.И я хочу хранить каждый контент в каждом элементе.

Вывод, который я получаю:

{
    "descriptions" => [
        [0] {
            "edutext" => "tik, där man under handledning får arbeta med olika arkivarieuppgifter."
        }
    ],
          "titles" => []
}

Как это работает?

...