protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnTest = (Button)findViewById(R.id.btnSeoul);
btnTest.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
StringBuffer sBuffer = new StringBuffer();
try{
String urlAddr = "URL(KEY포함)";//파싱할 URL 입력
URL url = new URL(urlAddr);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
if(conn != null){
conn.setConnectTimeout(20000);
conn.setUseCaches(false);
if(conn.getResponseCode()==HttpURLConnection.HTTP_OK){
InputStreamReader isr = new InputStreamReader(conn.getInputStream());
BufferedReader br = new BufferedReader(isr);
while(true){
String line = br.readLine();
if(line==null){
break;
}
sBuffer.append(line);
}
br.close();
conn.disconnect();
}
}
xml = sBuffer.toString();
}catch (Exception e) {
// TODO: handle exception
}
parse();
}
});
}
public void parse(){
try{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = factory.newDocumentBuilder();
InputStream is = new ByteArrayInputStream(xml.getBytes());
Document doc = documentBuilder.parse(is);
Element element = doc.getDocumentElement();
NodeList items = element.getElementsByTagName("mntNm"); //파싱할 노드의 태그네임 입력
int n = items.getLength();
StringBuffer sBuffer = new StringBuffer();
for(int i=0 ; i < n ; i++){
Node item = items.item(i);
Node text = item.getFirstChild();
String itemValue = text.getNodeValue();
str = Integer.toString((int) Double.parseDouble(itemValue));
sBuffer.append(str);
}
}catch (Exception e) {
// TODO: handle exception
Log.e("파싱 중 에러 발생", e.getMessage());
}
}
이런 코드를 통해서 Open API를 받아오는 방식인데요<result>
<key>사용자Key</key>
<totalCnt>100</totalCnt>
<pageUnit>10</pageUnit>
<pageIndex>1</pageIndex>
<searchCnm/>
<searchNm/>
<gdTrailInfo>
<mntnCd>2213100200</mntnCd>
<subNm>
<![CDATA[ 소양호에서 폭포 따라 정상까지 ]]>
</subNm>
<areaNm>
<![CDATA[ 강원도 춘천시, 홍천군 ]]>
</areaNm>
<mntHeight>1051</mntHeight>
주소를 통해서 브라우저 상에서 위와 같은 내용을 확인했습니다. 그래서 node이름을 mntNm으로 사용을 한 것이구요
그런데 Node Name을 입력하고 (ex: mntNm) 실행을 했을경우 예외가 발생합니다.
1428-1428/com.example.sangeun.xmlparsing E/파싱 중 에러 발생﹕ Attempt to invoke virtual method 'byte[] java.lang.String.getBytes()' on a null object reference
제가 Node이름을 잘못 명시해서 이런 오류가 발생하는 건가요 ? 아니면 접근 자체가 잘못된건지 모르겠네요