Подскажите пример парсинга XML файлов в Ruby! Есть такой код : Code: #!/usr/bin/ruby require 'net/http' require 'net/https' require 'uri' login = 'login' password = 'password' url = URI.parse('http://localhost:3000/home') resp = Net::HTTP.post_form(URI.parse('http://localhost:3000/home'), {'login' => login, 'password' => password}) cookies = resp.response['set-cookies'] http = Net::HTTP.new(url.host, url.port) url.path = '/controller/method/' req = Net::HTTP::Post.new(url.path + login + '.xml') req.basic_auth login, password req['Content-Type'] = 'application/atom+xml' http.use_ssl = false http.start do |http| response = http.request(req) case response when Net::HTTPSuccess puts "Connected !" + response.body #Good! else puts response.error! #ERROR! end end Делаю запрос на контроллер "controller" и метод "method" - в ответ получаю XML файл такого формата: Code: <user> <created-at type="datetime">2011-05- 12T09:32:54Z</created-at> <crypted-password>aaf7768e7d2f68bfbcf077bb11fb1638218446d3</crypted-password> <email>[email protected]</email> <id type="integer">2</id> <login>login</login> <name>name</name> <remember-token nil="true"></remember-token> <remember-token-expires-at type="datetime" nil="true"></remember-token-expires-at> <updated-at type="datetime">2011-05-12T09:32:54Z</updated-at> </user> собственно как бы это удобно распарсить из responce.body !? Благодарен за любую помощь !
Пробуй библиотекой Nokogiri К примеру xml ты получил в строку xml_string Тогда Code: require 'nokogiri' xml_doc = Nokogiri::XML(xml_string) email = xml_doc.css("user email").first.text login = xml_doc.css("user login").first.text и т.д
Подскажите в чем проблема при установке данного гема ? Code: No definition for get_options No definition for set_options No definition for parse_memory No definition for parse_file No definition for parse_with Installing RDoc documentation for nokogiri-1.4.4... No definition for get_options No definition for set_options No definition for parse_memory No definition for parse_file No definition for parse_with Я пишу : Code: sudo apt-get install libreadline-ruby1.8 libruby1.8 libopenssl-ruby sudo apt-get install libxslt-dev libxml2-dev sudo gem install nokogiri Потом когда в скрипте делаю вызов : Code: require 'nokogiri' оно мне : Code: main.rb:6:in `require': no such file to load -- nokogiri (LoadError)
А в ruby1.8 нужно Code: require 'rubygems' require 'nokogiri' Если собираешься работать с руби присмотрись к RVM для управлениями версиями Ruby и Gem`ов.
Спасибо ! Я что то не доглядел ) Собственно назрел еще вопрос : Создаю я значить ХМL файл из специального хеша и в теле POST запроса через HTTP передаю по адресу Code: http://localhost:3000/controller/method как нужно правильно обработать пришедший запрос что бы можно было вытянуть из него этот XML файл, распарсить его ну и вернуть некий результат !? У меня в понимание этого некие пробелы, хотелось бы восполнить .... благодарен за помощь, куски кода приветствуются )
Ты это делаешь в пределах одного приложения? RubyOnRails? Посмотри в принимаемом методе что-то есть в params?
Нет - не в одном... документ я формирую в приложение на Руби и через ПОСТ запрашиваю сервер на Руби на Рельсах ... так вот - как нужно в методе контроллера обработать етот запрос что бы можно было вытянуть переданный файл !?
Возник еще такой вопрос : Есть простой клиент Code: #!/usr/bin/ruby require 'rubygems' require 'httpclient' require 'builder' require 'active_support' def smp_request(http_method, url, options = {}) return nil if url.nil? || url.size == 0 #options["tokenid"] = "#{ROBOT_CLIENT_TOKEN}" p options if options.size > 0 clnt = HTTPClient.new http_method = "get" unless ["get", "post"].include?(http_method) puts "url is:#{url}" begin case http_method when "get" puts "Request get ..." request = clnt.get(url, options) puts "Request get ... executed" request.body when "post" puts "Request post ..." request = clnt.post(url, options) puts "Request post ... executed" request.body end rescue puts "There is error" return nil else puts "Request status = #{request.status}" return request end end puts "Input Name :" name = gets.chomp puts "Input Mail :" mail = gets.chomp puts "Input Pass :" pass = gets.chomp host = "http://localhost:3000/users/post" method = "post" data = {:login => name, :mail => mail, :password => pass} resp = smp_request(method, host, data) puts resp.body отсылающий на сервер некие данные, код метода простой Code: def post @user = User.new(:login => params[:login], :email => params[:mail], :password => params[:password]) respond_to do |accepts| if @user.save accepts.html accepts.xml { render :xml => @user.to_xml(:except => [:created_at, :updated_at]) } else format.html { render :action => "new" } format.xml { render :xml => @user.errors, :status => :unprocessable_entity } end end end Юзер на стороне сервера создается !!! Хотелось бы что бы в ответ от сервера приходил XML файл с данными только что созданного юзера, но приходит непонятно что .... Помогите разобрать ! Спасибо !
Если хочешь получать xml - тогда запрашивай xml. В твоем случае шли Post на Code: http://localhost:3000/users/post.xml