我无法使用我在脚本中编写的搜索方法来工作。以下是脚本中的相关代码:
$records = []
def xml_extractor(document)
document.xpath("//record").each do |record|
$records << {"id" => record.xpath('id').text,
"first_name" => record.xpath('first_name').text,
"last_name" => record.xpath('last_name').text,
"email" => record.xpath('email').text,
"gender" => record.xpath('gender').text,
"ip_address" => record.xpath('ip_address').text,
"send_date" => record.xpath('send_date').text,
"email_body" => record.xpath('email_body').text,
"email_title" => record.xpath('email_title').text}
puts record
end
puts "\nAll records loaded!"
end
def search_by_ip(ip)
record_to_return = $records.select {|k| k["ip_address"] == ip.to_s}
puts JSON.pretty_generate(record_to_return)
end
基本上我的xml_extractor方法工作正常,它使用nokogiri将所有内容存储到数组中。正在实现的xml文件有一千条记录,每条记录都有自己的first_name,last_name等。但问题是当我尝试在数组上实现search_by_ip方法时,返回一个“null”值,当该方法真的应该是什么时候正在返回属于该特定IP地址的整个记录。此外,我意识到每次实现xml_extractor方法时,即当xml文档被解析到数组中时,内容实际上并未保存,而是仅在循环进行时显示。这可能就是我为我的搜索方法获得“null”的原因。让我知道你们的想法。
答案 0 :(得分:0)
在ruby中,您的方法将返回最后一行。如果希望方法返回数据,则需要在最后一行返回它。 puts
不会返回任何内容。
尝试改变这样:
def search_by_ip(ip)
record_to_return = $records.select {|k| k["ip_address"] == ip.to_s}
puts JSON.pretty_generate(record_to_return)
record_to_return
end
答案 1 :(得分:0)
我写了一个如何使用OO来获得你想要的东西的例子。 我没有您的文档,所以我将您的文档简化为二维数组 在方法read中切换注释以使用xml 每种方法都可以链接,只做所需的方法 它们都可以分开测试(这里通过p&#39;它们)
class Xml_extractor
attr_reader :document, :records
def initialize document
@document = document
@records = []
end
def read
# @document.xpath("//record").each do |record|
@document.each do |record|
@records << {id: record[0], ip_address: record[1]}
end
self # return self so that you can chain another method
end
def search_by_ip(ip)
#return first of an array if found, nil otherwise
# attention to use a hash key here to search, not a string
@records.select {|k| k[:ip_address] == ip.to_s}.first
end
end
document = [[0, "192.168.0.1"], [1, "192.168.0.2"]]
p Xml_extractor.new(document).read.records
# [{:id=>0, :ip_address=>"192.168.0.1"}, {:id=>1, :ip_address=>"192.168.0.2"}]
p Xml_extractor.new(document).read.search_by_ip("192.168.0.2")
# [{:id=>1, :ip_address=>"192.168.0.2"}]
p Xml_extractor.new(document).read.search_by_ip("192.168.0.2").to_json
# "[{\"id\":1,\"ip_address\":\"192.168.0.2\"}]"