루비로 XML 문서 파싱하기
★프로그래밍/Ruby :: 2016. 8. 18. 20:05이전에 루비로 XML 문서 생성하는 방법에 관한 포스팅을 했습니다.
이번에는 반대로 XML 문서를 파싱하는 방법입니다.
이는 XML 문서의 각 요소들을 분석해서 추출하는 방법을 말합니다.
먼저, XML 파싱을 하려면 Nokogiri 라이브러리가 필요합니다.
설치 방법은 Builder와 같습니다. 콘솔 명령창에서 'gem list --local'이라고 쳐서 나오는 목록 중에 'nokogiri'가 없으면 설치해야 합니다.
nokogiri를 설치하려면 'gem install nokogiri'라고 치시면 됩니다.
(※ nokogirl이 아닙니다. nokogirl로 오타를 내는 사람이 많아서인지 nokogirl이라고 쳐도 되긴 하지만...)
루비로 XML 문서 생성하기 예제에서 생성했던 girlgroup.xml 파일을 다시 불러와 봅시다.
<?xml version="1.0" encoding="UTF-8"?> <girlgroup> <group name="여자친구" alias="GFRIEND" debut-date="20150116"> <member name="소원" birthday="19951207" position="leader, sub-vocal"/> <member name="예린" birthday="19960819" position="sub-vocal, lead-dancer"/> <member name="은하" birthday="19970530" position="lead-vocal"/> <member name="유주" birthday="19971014" position="main-vocal"/> <member name="신비" birthday="19980603" position="main-dancer, sub-vocal"/> <member name="엄지" birthday="19980819" position="sub-vocal"/> <album name="Season of Glass" type="ep" release="20150115"> <song track="1">Intro (Season of Glass)</song> <song track="2" title="yes">유리구슬 (Glass Bead)</song> <song track="3">Neverland</song> <song track="4">White (하얀마음)</song> <song track="5">유리구슬 (Glass Bead) (Inst.)</song> </album> <album name="Flower Bud" type="ep" release="20150723"> <song track="1">Intro (Flower Bud)</song> <song track="2" title="yes">오늘부터 우리는 (Me gustas tu)</song> <song track="3">하늘 아래서</song> <song track="4">ONE</song> <song track="5">기억해 (My Buddy)</song> <song track="6">오늘부터 우리는 (Me gustas tu) (Inst.)</song> </album> <album name="SNOWFLAKE" type="ep" release="20160125"> <song track="1">Intro (Snowflake)</song> <song track="2" title="yes">시간을 달려서 (Rough)</song> <song track="3">내 이름을 불러줘 (Say My Name)</song> <song track="4">사랑별 (Luv Star)</song> <song track="5">그런 날엔 (Someday)</song> <song track="6">TRUST</song> <song track="7">시간을 달려서 (Rough) (Inst.)</song> </album> <album name="LOL" type="studio" release="20160711"> <song track="1">INTRO</song> <song track="2">물들어요 (Fall in Love)</song> <song track="3" title="yes">너 그리고 나 (NAVILLERA)</song> <song track="4">LOL</song> <song track="5">한 뼘 (Distance)</song> <song track="6">물꽃놀이 (Water Flower)</song> <song track="7">Mermaid</song> <song track="8">나의 일기장 (Sunshine)</song> <song track="9">나침반 (Compas)</song> <song track="10">찰칵 (Click)</song> <song track="11">바람에 날려 (Gone with the wind)</song> <song track="12">너 그리고 나 (NAVILLERA) (Inst.)</song> </album> </group> </girlgroup>
우리는 이 XML 문서를 파싱하고자 합니다.
어떻게 할 것이냐면, '걸그룹 OOO에 대한 정보는 다음과 같습니다. 멤버 구성: 누구누구, 누구누구, 음반 목록 ...' 이런 형식으로 파싱해서 출력해 볼 것입니다.
그렇게 하기 위해 코드를 다음과 같이 짜 보겠습니다.
require 'nokogiri' # nokogiri 라이브러리 불러오기 doc = File.open("girlgroup.xml") { |f| Nokogiri::XML(f) } ggroup = doc.xpath("//group")[0] # 첫 번째 group에 대해 파싱 # <group name="여자친구"> 부분을 추출 puts sprintf("걸그룹 [%s]에 대한 정보는 다음과 같습니다.", ggroup["name"]) puts members = ggroup.xpath("//member") # 각 멤버 정보를 추출 print "멤버 구성: " members.each do |member| print member["name"] # 각 멤버 이름을 출력 print ", " if !member.equal?(members.last) # 마지막이 아니면 쉼표 출력 end puts puts; puts " *** 음반 목록 ***" albums = ggroup.xpath("//album") # 음반 정보 추출 albums.each do |album| if (album["type"] == "ep") alcat = "싱글" else alcat = "정규" end 50.times { print "=" }; puts # 구분선 출력 # 정규/싱글 여부 및 음반 제목 출력 puts sprintf(" ◈ [%s] %s", alcat, album["name"]) 50.times { print "-" }; puts # 구분선 출력 songs = album.xpath("song") # 각 음반별 수록곡 정보 추출 songs.each do |song| titleflag = song["title"].to_s.upcase == "YES" ? "T" : "" # 타이틀이면 'T' 표시 나오게 # 트랙 번호, 곡 제목 추출 (곡 제목은 텍스트 형태로 되어 있음) puts sprintf(" %1s %2d - %s", titleflag, song["track"].to_i, song.text) end puts end 50.times { print "=" }; puts # 마지막 구분선 출력
이 코드를 실행하면, 다음과 같은 텍스트가 출력될 것입니다.
걸그룹 [여자친구]에 대한 정보는 다음과 같습니다. 멤버 구성: 소원, 예린, 은하, 유주, 신비, 엄지 *** 음반 목록 *** ================================================== ◈ [싱글] Season of Glass -------------------------------------------------- 1 - Intro (Season of Glass) T 2 - 유리구슬 (Glass Bead) 3 - Neverland 4 - White (하얀마음) 5 - 유리구슬 (Glass Bead) (Inst.) ================================================== ◈ [싱글] Flower Bud -------------------------------------------------- 1 - Intro (Flower Bud) T 2 - 오늘부터 우리는 (Me gustas tu) 3 - 하늘 아래서 4 - ONE 5 - 기억해 (My Buddy) 6 - 오늘부터 우리는 (Me gustas tu) (Inst.) ================================================== ◈ [싱글] SNOWFLAKE -------------------------------------------------- 1 - Intro (Snowflake) T 2 - 시간을 달려서 (Rough) 3 - 내 이름을 불러줘 (Say My Name) 4 - 사랑별 (Luv Star) 5 - 그런 날엔 (Someday) 6 - TRUST 7 - 시간을 달려서 (Rough) (Inst.) ================================================== ◈ [정규] LOL -------------------------------------------------- 1 - INTRO 2 - 물들어요 (Fall in Love) T 3 - 너 그리고 나 (NAVILLERA) 4 - LOL 5 - 한 뼘 (Distance) 6 - 물꽃놀이 (Water Flower) 7 - Mermaid 8 - 나의 일기장 (Sunshine) 9 - 나침반 (Compas) 10 - 찰칵 (Click) 11 - 바람에 날려 (Gone with the wind) 12 - 너 그리고 나 (NAVILLERA) (Inst.) ==================================================
이렇게 파싱되었습니다.
이와 같이 루비에서는 XML 파일을 생성할 뿐만 아니라 XML 문서를 파싱해서 데이터를 처리하는 기능도 있습니다.
많은 도움 되셨나요?
유용한 정보로 활용하시기 바랍니다.