자바에서 XML 파싱해서 데이터 만지기.프로젝트/버스카드조회2018. 9. 17. 03:29
Table of Contents
반응형
저번에 노선정보조회 API를 만져 보았는데 ,
API를 사용함으로써 얻어진 XML 을 파싱해서 java에서 사용할 수있을까 싶었다.
할 수 있었다.
아참 , 그리고 strSrch=3 을 줌으로써 모든 값들을 가져와 보았다.
다음 코드소스는 노선정보조회 API 를 사용해서 xml 을 파싱해서 20번째까지 구해보았다.
데이터가 너무 많기 때문이다.
import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;public class ParsingExample {public static void main(String[] args) {// page는 파싱해오는 url을 구분해 주기 위한 것.int page = 1;try {while (true){String url = "http://ws.bus.go.kr/api/rest/busRouteInfo/getBusRouteList?"+ "ServiceKey=" # 인증키는 자신의 인증키를 넣어서 사용..+ "&strSrch=3"+page;// parsing할 url 지정 ( API 키 포함해서 이다 )// 페이지에 접근해줄 Document 객체를 생성해 주어야 한다.// 여기서 생성한 document 객체를 통해 파싱할 url의 요소를 읽어 들인다.// doc.getDocumentElement().getNodeName()를 출력하면 위 XML의 최상위 tag 값을 가져온다.// 여기서는 ServiceResult 가 최상위 tag값이 될 것이다.DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();Document doc = dBuilder.parse(url);doc.getDocumentElement().normalize();System.out.println("Root element : " + doc.getDocumentElement().getNodeName());// 여기는 파싱할 정보가 있는 tag에 접근하는 부분이다.// 여기서 파싱할 데이터는 <itemList>라는 tag안에 있기 때문에 나는 여기로 접근해야한다.// 그러면 nList에 <itemList> 태그가 하나씩 담기게 되고 , getLength()를 통해 리스트의 수를 확인할 수 있게된다.NodeList nList = doc.getElementsByTagName("itemList");System.out.println("파싱할 리스트 수 : " + nList.getLength());// 이 부분은 list에 담긴 데이터를 출력하는 부분// 위에 담긴 list를 반복문을 통해서 출력할 것이다// getTextContent() 는 전체 정보를 의미// getTagValue (" tag " , element ) : 입력한 tag 정보를 의미// getTagValue ( " tag " <- 실질적인 tag의 변수값을 넣어줘야 함 )// getTagValue는 따로 메소드를 만들어 준 것for (int temp = 0; temp < nList.getLength(); temp++) {// for문을 사용해 준 것은 모든 데이터를 출력해 보기 위해서이다.Node nNode = nList.item(temp);if (nNode.getNodeType() == Node.ELEMENT_NODE) {Element eElement = (Element) nNode;System.out.println("----------------------------------------");System.out.println("노선 ID : " + getTagValue("busRouteId", eElement));System.out.println("노선명 : " + getTagValue("busRouteNm", eElement));System.out.println("운수사명 : " + getTagValue("corpNm", eElement));System.out.println("금일첫차시간 : " + getTagValue("firstBusTm", eElement));System.out.println("금일저상첫차시간 : " + getTagValue("firstLowTm", eElement));System.out.println("금일저상막차시간 : " + getTagValue("lastLowTm", eElement));System.out.println("금일막차시간 : " + getTagValue("lastBusTm", eElement));System.out.println("노선 길이 (Km) : " + getTagValue("length", eElement));System.out.println("노선 유형 : " + getTagValue("routeType", eElement));System.out.println("기점 : " + getTagValue("stStationNm", eElement));System.out.println("종점 : " + getTagValue("edStationNm", eElement));System.out.println("배차간격 (분) : " + getTagValue("term", eElement));}}//하나의 리스트 값을 출력하면 +1 을 함으로써 구분시킬려고 , 20번째까지 구하기 위해서 , 임의로page += 1;System.out.println("page number " + page);if(page > 20){break;}}} catch (Exception e) {e.printStackTrace();}}// getTagValue 메소드 인데 , 이 부분은 TagName을 가져옴으로써 nlList에 저장을 시키는 부분private static String getTagValue(String tag, Element eElement) {NodeList nlList = eElement.getElementsByTagName(tag).item(0).getChildNodes();Node nValue = (Node) nlList.item(0);if (nValue == null) {return null;}return nValue.getNodeValue();}}
파싱을 하다가 헷갈린 부분이 있었는데 ,다음 부분이다 .NodeList nList = doc.getElementsByTagName("itemList");내가 TagName을 가져와야 하는데 , 어떤 tagName을 가져와야 할지 헷갈렸다.다음을 보면 SOAP_UI을 통해서 REST 해 본 것인데 , 빨간줄 쳐진 부분이 실질적으로내가 구하고자 하는 값들이 시작하는 tag이다.그래서 itemList를 넣어줌으로써 오류를 잡을 수 있었다.
또 헷갈린 부분이 있었다.
다음 코드인데 , 이부분은 첫 tag값을 가져오는 메서드이다.
위 사진을 보면 ServiceResult 란걸 쉽게 확인 할 수 있다.
그렇지만 처음하다보니까 모르겠었다.
아무튼 다음 코드는 첫 tag값을 가져온다.
doc.getDocumentElement().getNodeName()
반응형
'프로젝트 > 버스카드조회' 카테고리의 다른 글
프로젝트 변경 (2) | 2018.12.17 |
---|---|
후불교통카드 (2) | 2018.09.17 |
서울_노선정보조회_API 데이터 만지기. (0) | 2018.09.17 |
웹서비스 TEST 프로그램인 SOAP_UI를 설치해 보자 . (0) | 2018.09.17 |
Open_API ( based java ) (0) | 2018.09.16 |
@IT grow. :: IT grow.
#IT #먹방 #전자기기 #일상
#개발 #일상