Как лучше обрабатывать поток управления и обнулять объекты в ruby - PullRequest
0 голосов
/ 04 марта 2012

У меня есть этот скрипт, который является частью большего.У меня есть XML-файлы разных деревьев, которые немного отличаются друг от друга, и мне нужна какая-то структура управления, чтобы лучше обрабатывать выражения nil-object и xpath

Скрипт, который я сейчас имею, выводит объекты nil:

require 'open-uri'
require 'rexml/document'
include REXML

@urls = Array.new()
@urls << "http://testnavet.skolverket.se/SusaNavExport/EmilObjectExporter?id=186956355&amp;strId=info.uh.kau.KTADY1&amp;EMILVersion=1.1"
@urls << "http://testnavet.skolverket.se/SusaNavExport/EmilObjectExporter?id=184594606&amp;strId=info.uh.gu.GS5&amp;EMILVersion=1.1"
@urls << "http://testnavet.skolverket.se/SusaNavExport/EmilObjectExporter?id=185978100&amp;strId=info.uh.su.ARO720&amp;EMILVersion=1.1"

@urls.each do |url|
  doc = REXML::Document.new(open(url).read)
  doc.elements.each("/educationInfo/extensionInfo/nya:textualDescription/nya:textualDescriptionPhrase | /ns:educationInfo/ns:extensionInfo/gu:guInfoExtensions/gu:guSubject/gu:descriptions/gu:description | //*[name()='ct:text']"){
      |e| m = e.text 
      m.gsub!(/<.+?>/, "")
      puts "Description: " + m 
      puts ""   
    }
end

ВЫХОД:

Описание: bestrykning, kalandrering, tryckning, kemiteknik

Описание: Vill du jobba med internationella och globala frågor med ... Описание:Изучение глобализации становится все более важным для нашего понимания современного мира, и Школа глобальных исследований - это уникальная среда для исследований.

Описание:

Описание:

Описание: Идентификационный код Курсена и его скелетт.Kursen ger en ämneshistorisk bakgrund och skelettförändringars förhållanden до сегодняшних дней данных.

1 Ответ

1 голос
/ 04 марта 2012

См. в этом посте о том, как пропустить записи при использовании блока в ruby.Метод each () в doc.elements вызывается с блоком (код, содержащий gsub и вызывающий вызовы).Ключевое слово «next» позволит вам прекратить выполнение блока для текущего элемента и перейти к следующему.


doc.elements.each("/educationInfo/extensionInfo/nya:textualDescription/nya:textualDescriptionPhrase | /ns:educationInfo/ns:extensionInfo/gu:guInfoExtensions/gu:guSubject/gu:descriptions/gu:description | //*[name()='ct:text']"){
      |e| m = e.text 
      m.gsub!(//, "")

      next if m.empty?

      puts "Description: " + m 
      puts ""   
    }

Мы знаем, что «m» - это строка (а не nil) при использованииключевое слово "next", потому что мы только что назвали gsub!на нем, который не выдавал ошибку при выполнении этой строки.Это означает, что пустые описания вызваны пустыми строками, а не объектами nil.

...