1

我正在尝试使用 ruby​​ 读取 XML 格式的声纳报告。我写了以下代码:

class Resource
    attr_accessor :file_name, :lines, :generated_lines, :ncloc, :generated_ncloc, :statements, :comment_lines, :commented_out_code_lines, :lines_to_cover, :uncovered_lines, :conditions_to_cover, :uncovered_conditions, :line_coverage, :branch_coverage, :coverage, :test_success_density, :test_failures, :skipped_tests, :test_errors, :num_of_tests, :lang, :qualifier

    def to_s
        "#{@name} #{@lines} #{@generated_lines} #{@ncloc} #{@generated_ncloc} #{@statements} #{@comment_lines} #{@commented_out_code_lines} #{@lines_to_cover} #{@uncovered_lines} #{@conditions_to_cover} #{@uncovered_conditions} #{@line_coverage} #{@branch_coverage} #{@coverage} #{@test_success_density} #{@test_failures} #{@skipped_tests} #{@test_errors}#{@num_of_tests} #{@lang} #{@qualifier}"
    end 
end


sonar.root.each_element do |node1| # resources
    next if node1.name != "resources"
    node1.each_element do |node2| #resource
        resource = Resource.new
        resource.lang = node2.text if node2.name == "lang"
        resource.qualifier = node2.text if node2.name == "qualifier"
        resource.name = node.text if node2.name == "name"
    end
end

if如您所见,无论我使用条件还是语句,这都占用了太多case语句。在红宝石中有更简洁的方法吗?

4

1 回答 1

1

先过滤节点,而不是在迭代时切换。而且由于您对name属性的每个可能值都执行相同的操作,因此也可以通过循环将其干燥。

sonar.root.each_element_with_attribute 'name', 'resources' do |node1|
  %w[lang qualifier name].each do |name_val|
    node1.each_element_with_attribute 'name', name_val do |node2|
      resource = Resource.new
      resource.public_send :"#{name_val}=", node2.text
    end
  end
end

注意:我假设您在代码中使用 REXML,并且在撰写本文时您对我的评论缺乏回答。但是,我建议您改用更友好的Nokogiri

于 2013-05-17T04:46:42.630 回答