반응형
이전 블로그에서 가져온 글입니다. (2019.9.18)
회사에서 인턴하게 되었는데 첫작업이 공공API에서 데이터 가져오는 일이 되었다.
언어는 코틀린. 물론 난 이때 이 언어를 처음 접함
크롤링도 안해봤고 코틀린도 안해봐서 코드 짜는데 좀 걸렸다.
공공데이터포털에서 건축물대장 데이터를 사용
건축물대장 API결과
당연히 많은 데이터를 나한테 주지만, 나한테 필요한 정보는 아래 녀석들이다
- SigunguCd = 행정표준코드 / 시군구코드
- BjdongCd = 행정표준코드 / 법정동코드
- bun + ji = 번지
- atchSigunguCd = 부속시군구코드
- atchBjdongCd = 부속법정동코드
- atchBun + atchJi = 부속번지
코드
위의 것들은 실제 xml 태그명으로 사용된 항목들임으로 이것들을 잘 모아서 아래 코드를 짠! 하고 작성
코드를 아주 조금 설명하자면... 주석으로 하자
import org.w3c.dom.Document
import org.w3c.dom.Node
import org.w3c.dom.NodeList
import org.w3c.dom.Element
import javax.xml.parsers.DocumentBuilder
import javax.xml.parsers.DocumentBuilderFactory
fun main() {
//api 를 신청하게되면 접근할 수 있도록 키값을 준다. 그거 ㄱㄱ
val key : String = "키값"
//api 정보를 가지고 있는 주소
var url : String="http://apis.data.go.kr/1611000/BldRgstService/getBrAtchJibunInfo?sigunguCd=11680&bjdongCd=10300&serviceKey="+key
//기본적으로 xml형태를 가지게 된다. xml을 파싱하기 위한 코드.
//만약 본인은 json으로 해야한다! 싶으면 url 끝에 &_type=json 사용. 물론 내 코드에는 안된다.
val xml : Document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(url)
xml.documentElement.normalize()
println("Root element : "+xml.documentElement.nodeName)
//찾고자 하는 데이터가 어느 노드 아래에 있는지 확인
val list:NodeList=xml.getElementsByTagName("item")
for(i in 0..list.length-1){
var n:Node=list.item(i)
if(n.getNodeType()==Node.ELEMENT_NODE){
val elem=n as Element
val map=mutableMapOf<String,String>()
for(j in 0..elem.attributes.length - 1)
{
map.putIfAbsent(elem.attributes.item(j).nodeName, elem.attributes.item(j).nodeValue)
}
//list.length-1 (건축물 대장의 경우 디폴트 = 10)만큼 얻고자 하는 태그의 정보를 가져온다
println("=========${i+1}=========")
println("1. 법정동코드 : ${elem.getElementsByTagName("bjdongCd").item(0).textContent}")
println("2. 시군구코드 : ${elem.getElementsByTagName("sigunguCd").item(0).textContent}")
println("3. 번지 : ${elem.getElementsByTagName("bun").item(0).textContent}"+"${elem.getElementsByTagName("ji").item(0).textContent}")
println("4. 부속법정동코드 : ${elem.getElementsByTagName("atchBjdongCd").item(0).textContent}")
println("5. 부속시군구코드 : ${elem.getElementsByTagName("atchSigunguCd").item(0).textContent}")
println("6. 부속번지 : ${elem.getElementsByTagName("atchBun").item(0).textContent}"+"${elem.getElementsByTagName("atchJi").item(0).textContent}")
}
}
}
결과
728x90
'[Kotlin]' 카테고리의 다른 글
[Kotlin] JSON 파싱하기 (0) | 2022.05.08 |
---|