0

より大きなスクリプトの一部であるこのスクリプトがあります。互いに少し異なるように見えるツリーの異なる 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 behandlar identifieringen och beskrivningen av sjukliga förändringar i menskliga skelett. Kursen ger en ämnesistorisk bakgrund och skelettförandringars förhållanden to moderna kliniska data diskuteras.

4

1 に答える 1

1

rubyでブロックを使用するときにエントリをスキップする方法については、この投稿を参照してください。doc.elementsのメソッドeach()は、ブロック(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 ""   
    }

「next」キーワードを使用する場合、「m」は文字列(nilではない)であることがわかっています。これは、gsubを呼び出したばかりだからです。その上で、その行を実行するときにエラーをスローしませんでした。つまり、空白の説明は、nilオブジェクトではなく、空の文字列が原因です。

于 2012-03-03T22:45:25.077 に答える