Ruby로 XML에서 원하는 정보의 해시 만들기

13549 단어 hashXML루비

Ruby로 XML에서 원하는 정보의 해시 만들기



만약 더 좋은 방법이 있다면 코멘트 해주세요! !

PC 환경


  • Mac OS Mojave 10.14.1
  • Ruby 2.4.0

  • 무엇을 하고 싶은지



    게스 엔지니어의 토다 하지만 요 전날 ruby의 문제를 note로 출제하고 있었습니다.

    위의 참고는 아래 URL을 참조하십시오.
    htps : //에서. 무 / 코 0305 / n / n 339931 3f705

    루비에서 일기 예보 프로그램을 작성하지만,

    라이브 도어의 날씨 서비스 API를 사용할 때,

    ぇ tp : // 우우 아테아 r. 아오오오 r. 이 m/후레카 st/rs/p리마 ry_어라. xml

    미리 장소의 city id 를 알지 않으면 안됩니다.

    조사하고 싶은 장소가 바뀔 때마다 city id 를 재설정하는 것은 귀찮습니다.

    그렇다면,

    ぇ tp : // 우우 아테아 r. 아오오오 r. 이 m/후레카 st/rs/p리마 ry_어라. xml 의 정보에서

    장소를 키, city id 를 값으로 한 해시를 작성해 버리면 수고를 줄일 수 있을까 생각했습니다.



    실제 해시 작성 프로그램



    실제로 만든 프로그램입니다.
    require 'open-uri'
    require "rexml/document"
    require 'active_support'
    require 'active_support/core_ext'
    
    xml_url = open("http://weather.livedoor.com/forecast/rss/primary_area.xml").read.toutf8
    xml_doc = REXML::Document.new(xml_url)
    xml_hash = Hash.from_xml(xml_doc.to_s)
    city_id_hash = {}
    xml_hash["rss"]["channel"]["source"]["pref"].each do |key|
      count = 0
      #ハッシュ作成
      while key["city"][count] != nil do
        city_id_hash[key["city"][count]["title"]] = key["city"][count]["id"] 
        count += 1
      end
    end
    
    #確認用
    puts city_id_hash
    

    실행 결과는 다음과 같습니다.
    {"稚内"=>"011000", "旭川"=>"012010", "留萌"=>"012020", "網走"=>"013010", "北見"=>"013020", "紋別"=>"013030", "根室"=>"014010", "釧路"=>"014020", "帯広"=>"014030", "室蘭"=>"015010", "浦河"=>"015020", "札幌"=>"016010", "岩見沢"=>"016020", "倶知安"=>"016030", "函館"=>"017010", "江差"=>"017020", "青森"=>"020010", "むつ"=>"020020", "八戸"=>"020030", "盛岡"=>"030010", "宮古"=>"030020", "大船渡"=>"030030", "仙台"=>"040010", "白石"=>"040020", "秋田"=>"050010", "横手"=>"050020", "山形"=>"060010", "米沢"=>"060020", "酒田"=>"060030", "新庄"=>"060040", "福島"=>"070010", "小名浜"=>"070020", "若松"=>"070030", "水戸"=>"080010", "土浦"=>"080020", "宇都宮"=>"090010", "大田原"=>"090020", "前橋"=>"100010", "みなかみ"=>"100020", "さいたま"=>"110010", "熊谷"=>"110020", "秩父"=>"110030", "千葉"=>"120010", "銚子"=>"120020", "館山"=>"120030", "東京"=>"130010", "大島"=>"130020", "八丈島"=>"130030", "父島"=>"130040", "横浜"=>"140010", "小田原"=>"140020", "新潟"=>"150010", "長岡"=>"150020", "高田"=>"150030", "相川"=>"150040", "富山"=>"160010", "伏木"=>"160020", "金沢"=>"170010", "輪島"=>"170020", "福井"=>"180010", "敦賀"=>"180020", "甲府"=>"190010", "河口湖"=>"190020", "長野"=>"200010", "松本"=>"200020", "飯田"=>"200030", "岐阜"=>"210010", "高山"=>"210020", "静岡"=>"220010", "網代"=>"220020", "三島"=>"220030", "浜松"=>"220040", "名古屋"=>"230010", "豊橋"=>"230020", "津"=>"240010", "尾鷲"=>"240020", "大津"=>"250010", "彦根"=>"250020", "京都"=>"260010", "舞鶴"=>"260020", "神戸"=>"280010", "豊岡"=>"280020", "奈良"=>"290010", "風屋"=>"290020", "和歌山"=>"300010", "潮岬"=>"300020", "鳥取"=>"310010", "米子"=>"310020", "松江"=>"320010", "浜田"=>"320020", "西郷"=>"320030", "岡山"=>"330010", "津山"=>"330020", "広島"=>"340010", "庄原"=>"340020", "下関"=>"350010", "山口"=>"350020", "柳井"=>"350030", "萩"=>"350040", "徳島"=>"360010", "日和佐"=>"360020", "松山"=>"380010", "新居浜"=>"380020", "宇和島"=>"380030", "高知"=>"390010", "室戸岬"=>"390020", "清水"=>"390030", "福岡"=>"400010", "八幡"=>"400020", "飯塚"=>"400030", "久留米"=>"400040", "佐賀"=>"410010", "伊万里"=>"410020", "長崎"=>"420010", "佐世保"=>"420020", "厳原"=>"420030", "福江"=>"420040", "熊本"=>"430010", "阿蘇乙姫"=>"430020", "牛深"=>"430030", "人吉"=>"430040", "大分"=>"440010", "中津"=>"440020", "日田"=>"440030", "佐伯"=>"440040", "宮崎"=>"450010", "延岡"=>"450020", "都城"=>"450030", "高千穂"=>"450040", "鹿児島"=>"460010", "鹿屋"=>"460020", "種子島"=>"460030", "名瀬"=>"460040", "那覇"=>"471010", "名護"=>"471020", "久米島"=>"471030", "南大東"=>"472000", "宮古島"=>"473000", "石垣島"=>"474010", "与那国島"=>"474020"}
    

    꽤 역기 같은 생각은 합니다만, 우선은 할 수 있었습니다.

    제작에 이르기까지의 시행착오



    우선
    xml_url = open("http://weather.livedoor.com/forecast/rss/primary_area.xml").read.toutf8
    xml_doc = REXML::Document.new(xml_url)
    xml_hash = Hash.from_xml(xml_doc.to_s)
    

    에서 ぇ tp : // 우우 아테아 r. 아오오오 r. 이 m/후레카 st/rs/p리마 ry_어라. xml 의 정보를 해시로 변환합니다.

    다음
    city_id_hash = {}
    xml_hash["rss"]["channel"]["source"]["pref"].each do |key|
      count = 0
      #ハッシュ作成
      while key["city"][count] != nil do
        city_id_hash[key["city"][count]["title"]] = key["city"][count]["id"] 
        count += 1
      end
    end
    

    에서 지명과 그것에 대응하는 city id 만을 꺼내 해시를 작성하고 있습니다.
    작성 중에는 어느 키에 지명이나 city id가 묻혀 있는지 모르기 때문에,
    xml_hash["rss"]["channel"]["source"]["pref"]
    

    에 관해서는 xml_hash.keys 이나 xml_hash["rss"].keys
    while문의 조건, key["city"][count] != nil 는 왜 이렇게 하고 있는가 하면
    도도부현마다 소유하고 있는 지명이 다르기 때문입니다.
    이 구현에 대해서는 실제로 puts key["city"] 를 루프중에 삽입해 동작을 확인해 주시는 것으로 이해할 수 있다고 생각합니다. 꼭 생각해 보세요.

    현재의 문제점



    실행 속도가 느린 것 같다.

    더 좋은 방법이 있다면 꼭 댓글을 달아주세요!

    요약



    이번 구현의 포인트는

    1. xml을 hash로 로드
    2. 로드한 hash의 데이터 구조를 조사한다
    3. 원하는 정보를 뽑아내고 싶었던 해시를 완성시킨다

    이었다.

    참고 기사


  • 『kzfm’s trial and error 책 허리에 넣어 Ruby나 PHP를 기억해 가는 블로그. 』
  • XML Parse (Ruby)
  • htp // kzfms. 는 bぉ. jp/엔트리/2015/06/07/014735

  • 좋은 웹페이지 즐겨찾기