XML 형식의 데이터 파싱, 검색기능 구현
데이터를 파싱하기 위해 데이터 애트리뷰트에 맞게 커스텀 클래스를 만든다.
데이터 상세설명에 가면 필드를 확인할 수 있다.
결과코드 | resultCode | 2 | 필수 | 00 | 결과코드 |
암호화된 요양기호 | ykiho | 400 | 필수 | {생략} | {생략} |
병원명 | yadmNm | 150 | 옵션 | 서울특별시서울의료원 | 병원명 |
종별코드 | clCd | 2 | 옵션 | 11 | 종별코드 |
종별코드명 | clCdNm | 150 | 옵션 | 종합병원 | 종별코드명 |
시도코드 | sidoCd | 6 | 옵션 | 110000 | 시도코드 |
시도명 | sidoCdNm | 150 | 옵션 | 서울 | 시도명 |
시군구코드 | sgguCd | 6 | 옵션 | 110019 | 시군구코드 |
시군구명 | sgguCdNm | 150 | 옵션 | 중랑구 | 시군구명 |
읍면동명 | emdongNm | 150 | 옵션 | 신내동 | 읍면동명 |
우편번호 | postNo | 6 | 옵션 | 02053 | 우편번호 |
주소 | addr | 500 | 옵션 | 서울특별시 중랑구 신내로 156 (신내동) | 주소 |
전화번호 | telno | 30 | 옵션 | 02-2276-7000 | 전화번호 |
홈페이지 | hospUrl | 500 | 옵션 | http://www.seoulmc.or.kr | 홈페이지 |
개설일자 | estbDd | 8 | 옵션 | 20110314 | 개설일자 |
의사총수 | drTotCnt | 14 | 옵션 | 227 | 의사총수 |
의과일반의 인원수 | mdeptGdrCnt | 22 | 옵션 | 0 | 의과일반의 인원수 |
의과인턴 인원수 | mdeptIntnCnt | 22 | 옵션 | 28 | 의과인턴 인원수 |
의과레지던트 인원수 | mdeptResdntCnt | 22 | 옵션 | 64 | 의과레지던트 인원수 |
의과전문의 인원수 | mdeptSdrCnt | 22 | 옵션 | 131 | 의과전문의 인원수 |
치과일반의 인원수 | detyGdrCnt | 22 | 옵션 | 1 | 치과일반의 인원수 |
치과인턴 인원수 | detyIntnCnt | 22 | 옵션 | 0 | 치과인턴 인원수 |
치과레지던트 인원수 | detyResdntCnt | 22 | 옵션 | 0 | 치과레지던트 인원수 |
치과전문의 인원수 | detySdrCnt | 22 | 옵션 | 2 | 치과전문의 인원수 |
한방일반의 인원수 | cmdcGdrCnt | 22 | 옵션 | 1 | 한방일반의 인원수 |
한방인턴 인원수 | cmdcIntnCnt | 22 | 옵션 | 0 | 한방인턴 인원수 |
한방레지던트 인원수 | cmdcResdntCnt | 22 | 옵션 | 0 | 한방레지던트 인원수 |
한방전문의 인원수 | cmdcSdrCnt | 22 | 옵션 | 0 | 한방전문의 인원수 |
x좌표 | XPos | 18 | 옵션 | 127.09854004628151 | x좌표(소수점 13) |
y좌표 | YPos | 18 | 옵션 | 37.6132113197367 | y좌표(소수점 13) |
거리 | distance | 10 | 옵션 | 0 | 단위: 미터(m) |
무척많다. 전부 다 필요하진 않지만 일단 다 추가했다.
public class Item {
private String clCd;
private String clCdNm;
private String cmdcGdrCnt;
private String cmdcIntnCnt;
private String cmdcResdntCnt;
private String cmdcSdrCnt;
private String detyGdrCnt;
private String detyIntnCnt;
private String detyResdntCnt;
private String detySdrCnt;
private String distance;
private String drTotCnt;
private String estbDd;
private String hospUrl;
private String mdeptGdrCnt;
private String mdeptIntnCnt;
private String mdeptResdntCnt;
private String mdeptSdrCnt;
private String postNo;
private String sgguCd;
private String sgguCdNm;
private String sidoCd;
private String sidoCdNm;
private String telno;
private String XPos;
private String YPos;
private String yadmNm;
private String ykiho;
private String addr;
public void setClCd(String clCd) {
this.clCd = clCd;
}
public void setClCdNm(String clCdNm) {
this.clCdNm = clCdNm;
}
public void setCmdcGdrCnt(String cmdcGdrCnt) {
this.cmdcGdrCnt = cmdcGdrCnt;
}
public void setCmdcIntnCnt(String cmdcIntnCnt) {
this.cmdcIntnCnt = cmdcIntnCnt;
}
public void setCmdcResdntCnt(String cmdcResdntCnt) {
this.cmdcResdntCnt = cmdcResdntCnt;
}
public void setCmdcSdrCnt(String cmdcSdrCnt) {
this.cmdcSdrCnt = cmdcSdrCnt;
}
public void setDetyGdrCnt(String detyGdrCnt) {
this.detyGdrCnt = detyGdrCnt;
}
public void setDetyIntnCnt(String detyIntnCnt) {
this.detyIntnCnt = detyIntnCnt;
}
public void setDetyResdntCnt(String detyResdntCnt) {
this.detyResdntCnt = detyResdntCnt;
}
public void setDetySdrCnt(String detySdrCnt) {
this.detySdrCnt = detySdrCnt;
}
public void setDistance(String distance) {
this.distance = distance;
}
public void setDrTotCnt(String drTotCnt) {
this.drTotCnt = drTotCnt;
}
public void setEstbDd(String estbDd) {
this.estbDd = estbDd;
}
public void setHospUrl(String hospUrl) {
this.hospUrl = hospUrl;
}
public void setMdeptGdrCnt(String mdeptGdrCnt) {
this.mdeptGdrCnt = mdeptGdrCnt;
}
public void setMdeptIntnCnt(String mdeptIntnCnt) {
this.mdeptIntnCnt = mdeptIntnCnt;
}
public void setMdeptResdntCnt(String mdeptResdntCnt) {
this.mdeptResdntCnt = mdeptResdntCnt;
}
public void setMdeptSdrCnt(String mdeptSdrCnt) {
this.mdeptSdrCnt = mdeptSdrCnt;
}
public void setPostNo(String postNo) {
this.postNo = postNo;
}
public void setSgguCd(String sgguCd) {
this.sgguCd = sgguCd;
}
public void setSgguCdNm(String sgguCdNm) {
this.sgguCdNm = sgguCdNm;
}
public void setSidoCd(String sidoCd) {
this.sidoCd = sidoCd;
}
public void setSidoCdNm(String sidoCdNm) {
this.sidoCdNm = sidoCdNm;
}
public void setTelno(String telno) {
this.telno = telno;
}
public void setXPos(String XPos) {
this.XPos = XPos;
}
public void setYPos(String YPos) {
this.YPos = YPos;
}
public void setYadmNm(String yadmNm) {
this.yadmNm = yadmNm;
}
public void setYkiho(String ykiho) {
this.ykiho = ykiho;
}
public void setAddr(String addr) {
this.addr = addr;
}
public String getAddr() {
return addr;
}
public String getClCd() {
return clCd;
}
public String getClCdNm() {
return clCdNm;
}
public String getCmdcGdrCnt() {
return cmdcGdrCnt;
}
public String getCmdcIntnCnt() {
return cmdcIntnCnt;
}
public String getCmdcResdntCnt() {
return cmdcResdntCnt;
}
public String getCmdcSdrCnt() {
return cmdcSdrCnt;
}
public String getDetyGdrCnt() {
return detyGdrCnt;
}
public String getDetyIntnCnt() {
return detyIntnCnt;
}
public String getDetyResdntCnt() {
return detyResdntCnt;
}
public String getDetySdrCnt() {
return detySdrCnt;
}
public String getDistance() {
return distance;
}
public String getDrTotCnt() {
return drTotCnt;
}
public String getEstbDd() {
return estbDd;
}
public String getHospUrl() {
return hospUrl;
}
public String getMdeptGdrCnt() {
return mdeptGdrCnt;
}
public String getMdeptIntnCnt() {
return mdeptIntnCnt;
}
public String getMdeptResdntCnt() {
return mdeptResdntCnt;
}
public String getMdeptSdrCnt() {
return mdeptSdrCnt;
}
public String getPostNo() {
return postNo;
}
public String getSgguCd() {
return sgguCd;
}
public String getSgguCdNm() {
return sgguCdNm;
}
public String getSidoCd() {
return sidoCd;
}
public String getSidoCdNm() {
return sidoCdNm;
}
public String getTelno() {
return telno;
}
public String getXPos() {
return XPos;
}
public String getYPos() {
return YPos;
}
public String getYadmNm() {
return yadmNm;
}
public String getYkiho() {
return ykiho;
}
}String 변수와 getter, setter가 전부다.
public static List < Item > processXML(String str) throws ParserConfigurationException, IOException, SAXException { //비거래처
List < Item > newList = new ArrayList < > ();
InputSource is = new InputSource(new StringReader(str));
Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(is);
String s = "";
NodeList nodeList = document.getElementsByTagName("item");
for (int i = 0; i < nodeList.getLength(); i++) {
Element nodeElement = (Element) nodeList.item(i);
Item item = new Item();
try {
NodeList yadmNm = nodeElement.getElementsByTagName("yadmNm"); //병원명
item.setYadmNm(yadmNm.item(0).getChildNodes().item(0).getNodeValue());
NodeList mdeptGdrCnt = nodeElement.getElementsByTagName("mdeptGdrCnt"); //의과일반의 총 수
item.setMdeptGdrCnt(mdeptGdrCnt.item(0).getChildNodes().item(0).getNodeValue());
NodeList telno = nodeElement.getElementsByTagName("telno");
item.setTelno(telno.item(0).getChildNodes().item(0).getNodeValue());
NodeList XPos = nodeElement.getElementsByTagName("XPos");
item.setXPos(XPos.item(0).getChildNodes().item(0).getNodeValue());
NodeList YPos = nodeElement.getElementsByTagName("YPos");
item.setYPos(YPos.item(0).getChildNodes().item(0).getNodeValue());
NodeList clCd = nodeElement.getElementsByTagName("clCd");
item.setClCd(clCd.item(0).getChildNodes().item(0).getNodeValue());
} catch (Exception e) {
e.printStackTrace();
}
newList.add(item);
}
return newList;
}
그 다음은 String형식의 XML데이터에서 NodeList를 이용해서 필요한 애트리뷰트의 값을 쏙쏙 뽑아내서 새로 생성한 item 객체에 setter를 이용해 값을 넣었다.
그렇게 불러온 item의 리스트에서 xPos, yPos 를 MapPoint.mapPointWithGeoCoord를 써서 좌표설정 해주고
병원이름 외의 부가정보를 setItemName에다가 "/"로 구분해서 집어넣었다. 나중에 뷰에 넣을때 split("/") 으로 각각 넣을 생각으로 한 것인데 다른 방법이 있을지 생각해봐야겠다.
try-catch 구문도 잊지 않고 써준다. 데이터중에 좌표값이 없는 것도 있다.
그렇다고 for문을 통째로 try안에 넣었다가는 여러개의 데이터 중 하나에서만 예외가 발생해도 모든 데이터가 영향을 받는다.