Как лучше обрабатывать поток управления и нулевые объекты в Ruby

У меня есть этот сценарий, который является частью более крупного. У меня есть древовидные 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

ВЫВОД:

Описание: бестрыкнинг, каландреринг, трикнинг, кемитекник

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

Описание:

Описание:

Описание: Курсэн бэчендлар идентификатор и открыт для скелетной модели. Kursen ger en ämneshistorisk bakgrund och skelettförändringars förhållanden till moderna kliniska data diskuteras.


person Community    schedule 03.03.2012    source источник
comment
Подсказки: puts "Description: " + m лучше писать как puts "Description: #{m}", IMO. Кроме того, puts "" эквивалентно просто puts. Также вы можете использовать только foo = [] вместо foo = Array.new (подробнее см. этот вопрос тот).   -  person Andrew Marshall    schedule 04.03.2012


Ответы (1)


См. этот пост о том, как пропустить записи при использовании блок в рубине. Метод 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! на нем, что не привело к ошибке при выполнении этой строки. Это означает, что пустые описания вызваны пустыми строками, а не нулевыми объектами.

person sgmorrison    schedule 03.03.2012
comment
Замечательный приятель, мне нужно сохранить регулярное выражение, потому что оно удаляет (не выводит его на печать) все теги html из XML-файлов. - person ; 04.03.2012