
XML 파일이란?
eXtensible Markup Language의 약어로 다목적 마크업 언어.
태그 등을 이용하여 데이터의 구조를 기술하는 언어의 한 가지.
가장 친숙하고 흔하게 접할 수 있는 비슷한 마크업 언어로 HTML이 있음.
일반 텍스트 파일이랑 다르게 태그가 달려 있으며, 태그의 구조/레벨에 따라 인덴트도 되어있다.
XML 파일을 어떻게 읽을까?
일단 XML과 JSON처럼 특수 형태의 파일 읽기의 기본 과정은 같다.
1. open과 read 함수를 이용하여 일단 파일을 string으로 읽어오기
2. 전용 모듈로 한 번 가공해주기
3. 원하는 정보 추출하기
■ 1. 파일을 스트링으로 읽어오기
여기 books.xml파일이 있다.
먼저 텍스트 파일 읽었을 때처럼 간단히 read, readline, realines를 사용해서 이 xml 파일을 읽어보았다.
당연하지만, read()는 전체를 스트링으로 읽어오기,
readline()은 한 줄만 읽어오기
readlines()는 전체를 리스트로 읽어오기로 된다.

우리는 read()로 해서 전체를 스트링으로 읽어오겠다.
하지만, 여기서 어떻게 원하는 정보를 추출할 것인가?
xml은 그냥 텍스트 파일 처럼 줄글 형식이 아니다. 태그로 이루어져있다.
우리가 xml 파일을 읽는 목적은 아무래도 특정 태그명 사이의 정보를 뽑아 보는 것이다.
원하는 태그를 검색해서, 이 태그 사이의 정보를 뽑아와보자.
<태그> 어쩌고저쩌고 </태그>
<state> SeongNam </state>
위의 xml파일의 경우엔 어떻게 하면 'state'이란 태그 사이의 WA와 SeongNam이란 단어를 찾을까?
일단, read()로 해서 모든 내용물을 스트링으로 받아 왔으니, find 함수를 사용할 수 도 있겠다. 하지만...
참고로 find()는 스트링 전용 함수로, 리스트에 사용 불가하다. 그리고 앞에서 부터 딱 1개만 찾아준다.
그래서, 위 xml파일의 경우 SeongNam은 못찾고 WA만 찾아 줄 것이다.
그래서, xml파일을 읽고 정보를 조회할 때 쓰는 더 나은 방안이 있다.
■ 2. 불러온 스트링을 전용 xml 모듈로 가공해주기 :
xml 파일을 보다 잘~ 읽기 위해서는 전문 모듈을 불러와야 한다.
BeautifulSoup과 ElementTree가 유명한데, 여기서 나는 BeautifulSoup을 사용하겠다.
from bs4 import BeautifulSoup
그런 다음, 우리가 f = open(<파일명>,<접근모드>)를 외쳤듯이. 아래와 같이 외쳐준다.
주의할 것은 BeautifulSoup('파일명.xml','lxml')이 아니란 것이다.
첫 번째 인자로는 태그가 들어간 스트링이 들어가야 한다. 파일명이 아니다!!
우리는 이미 open('파일명.xml','r')로 xml 파일을 불러왔다. 파일명 자체에 다시 접근할 일이 이젠 없다.
아까 위에서 우리가 open(<파일명>,'r')와 read()로 받아온 태그가 잔뜩 달린 스트링을 넣어주도록 하자.
soup = BeautifulSoup(<스트링 태그 내용물>,'lxml')
soup은 스트링을 가공해준 것으로. 그 자체로는 잘 알아볼 수가 없다.
여기서 추가적인 attribute를 사용해 주어야 한다.
뷰티풀숲에 다양한 attribute들이 있겠지만, 일단 아래 두 가지만 설명하겠다.
- find() : 스트링에 쓰이는 파이썬 내장 함수와 비슷하게 딱 첫번째만 찾아준다.
스트링.find()는 위치값을 숫자로 반환한다면.
soup.find()는 찾아낸 것을 스트링으로 반환한다.
- find_all() : 해당 태그를 모두 찾은 후, 리스트로 반환한다. 1개를 찾았다고 하더라도 리스트로 반환한다.

- get_text() : 앞뒤 태그를 제외하고 정말 가운데 내용물만 반환한다.
