Ruby로 XML에서 원하는 정보의 해시 만들기
Ruby로 XML에서 원하는 정보의 해시 만들기
만약 더 좋은 방법이 있다면 코멘트 해주세요! !
PC 환경
무엇을 하고 싶은지
게스 엔지니어의 토다 하지만 요 전날 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. 원하는 정보를 뽑아내고 싶었던 해시를 완성시킨다
이었다.
참고 기사
Reference
이 문제에 관하여(Ruby로 XML에서 원하는 정보의 해시 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/t_morimori777/items/acc1a4c81ed512738af8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)