Парсинг XML в Ruby !!!

Discussion in 'PHP' started by 043nKRuT0y, 12 May 2011.

  1. 043nKRuT0y

    043nKRuT0y Elder - Старейшина

    Joined:
    31 Oct 2007
    Messages:
    226
    Likes Received:
    8
    Reputations:
    0
    Подскажите пример парсинга 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 !?

    Благодарен за любую помощь !
     
  2. Reed Jenkins

    Reed Jenkins New Member

    Joined:
    11 Apr 2011
    Messages:
    9
    Likes Received:
    1
    Reputations:
    0
    Пробуй библиотекой 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
    и т.д
    
     
  3. 043nKRuT0y

    043nKRuT0y Elder - Старейшина

    Joined:
    31 Oct 2007
    Messages:
    226
    Likes Received:
    8
    Reputations:
    0
    Подскажите в чем проблема при установке данного гема ?
    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)
     
  4. Reed Jenkins

    Reed Jenkins New Member

    Joined:
    11 Apr 2011
    Messages:
    9
    Likes Received:
    1
    Reputations:
    0
    А в ruby1.8 нужно
    Code:
    require 'rubygems'
    require 'nokogiri'
    
    Если собираешься работать с руби присмотрись к RVM для управлениями версиями Ruby и Gem`ов.
     
    1 person likes this.
  5. 043nKRuT0y

    043nKRuT0y Elder - Старейшина

    Joined:
    31 Oct 2007
    Messages:
    226
    Likes Received:
    8
    Reputations:
    0
    Спасибо ! Я что то не доглядел )

    Собственно назрел еще вопрос :
    Создаю я значить ХМL файл из специального хеша и в теле POST запроса через HTTP передаю по адресу
    Code:
    http://localhost:3000/controller/method  
    как нужно правильно обработать пришедший запрос что бы можно было вытянуть из него этот XML файл, распарсить его ну и вернуть некий результат !?
    У меня в понимание этого некие пробелы, хотелось бы восполнить .... благодарен за помощь, куски кода приветствуются )
     
  6. Reed Jenkins

    Reed Jenkins New Member

    Joined:
    11 Apr 2011
    Messages:
    9
    Likes Received:
    1
    Reputations:
    0
    Ты это делаешь в пределах одного приложения? RubyOnRails?

    Посмотри в принимаемом методе что-то есть в params?
     
  7. 043nKRuT0y

    043nKRuT0y Elder - Старейшина

    Joined:
    31 Oct 2007
    Messages:
    226
    Likes Received:
    8
    Reputations:
    0
    Нет - не в одном... документ я формирую в приложение на Руби и через ПОСТ запрашиваю сервер на Руби на Рельсах ... так вот - как нужно в методе контроллера обработать етот запрос что бы можно было вытянуть переданный файл !?
     
  8. 043nKRuT0y

    043nKRuT0y Elder - Старейшина

    Joined:
    31 Oct 2007
    Messages:
    226
    Likes Received:
    8
    Reputations:
    0
    Возник еще такой вопрос :
    Есть простой клиент
    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 файл с данными только что созданного юзера, но приходит непонятно что ....

    Помогите разобрать ! Спасибо !
     
  9. Reed Jenkins

    Reed Jenkins New Member

    Joined:
    11 Apr 2011
    Messages:
    9
    Likes Received:
    1
    Reputations:
    0
    Если хочешь получать xml - тогда запрашивай xml. В твоем случае шли Post на
    Code:
    http://localhost:3000/users/post.xml
     
  10. 043nKRuT0y

    043nKRuT0y Elder - Старейшина

    Joined:
    31 Oct 2007
    Messages:
    226
    Likes Received:
    8
    Reputations:
    0
    Так не выходит !!!