본문으로 바로가기

[안드로이드]xml파싱(xml parser)

category Android 2017. 9. 4. 15:07

안녕하세요.


이번에는 json파싱에 이어 xml파싱을 알아보겠습니다.


이번에도 간단한 예제를 통하여 알아볼건데요.


json 이나 xml 이나 tag를 구분하여 내가 원하는값을 찾는건 같습니다.


하지만 어떤 값인가에 따라 파싱하는 방법이 다른데요.


xml은 말 그대로 xml 형식의 파일을 파싱할때 쓰입니다.


<items>
<item>
<idx>1</idx>
<gugun>부산진구</gugun>
<instt>부산광역시 부산진구청</instt>
<spot>부산진구청</spot>
<spotGubun>아파트, 공공기관 등 주변</spotGubun>
<setGroupCnt>3</setGroupCnt>
<setCnt>21</setCnt>
<sunscreen>32</sunscreen>
<airPump>태양광</airPump>
<setDate>1999</setDate>
<updtDate>2016-01-01</updtDate>
</item>
<item>
<idx>2</idx>
<gugun>부산진구</gugun>
<instt>부산광역시 부산진구청</instt>
<spot>부암역 6번출구(E/V) 옆</spot>
<spotGubun>대중교통주변</spotGubun>
<setGroupCnt>1</setGroupCnt>
<setCnt>7</setCnt>
<sunscreen></sunscreen>
<airPump>태양광</airPump>
<setDate>1999</setDate>
<updtDate>2016-01-01</updtDate>
</item>

보이는 예제가 xml 형식의 문서입니다.


잘 보면 item 태그가 하나의 항목을 담고있고 item 태그 안의 세부태그들이 항목의 정보를 담고있습니다.


이것들을 기준으로 파싱을 할 수 있는데요.


예제를 보면서 알아보겠습니다.

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textview = (TextView) findViewById(R.id.textView1);

        new GetXMLTask().execute();
    }


먼저 메인입니다. 메인은 파싱한 결과를 보여주기위한 textview 하나만 선언하였습니다.


그리고 AsyncTask 를 통해 파싱한 값을 가져옵니다. 그 과정에서 textview 에 결과를 출력하는 과정도 포함되어있습니다.


private class GetXMLTask extends AsyncTask<String, Void, Document>{
        @Override
        protected Document doInBackground(String... urls) {
            URL url;
            try {
                url = new URL("http://apis.data.go.kr/6260000/BusanBicycleInfoService/getBicycleRackInfo?numOfRows=10&ServiceKey=??");
                DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
                DocumentBuilder db = dbf.newDocumentBuilder();
                doc = db.parse(new InputSource(url.openStream()));
                doc.getDocumentElement().normalize();

            } catch (Exception e) {
                Toast.makeText(getBaseContext(), "Parsing Error", Toast.LENGTH_SHORT).show();
            }
            return doc;
        }

        @Override
        protected void onPostExecute(Document doc) {

            String s = "";
            NodeList nodeList = doc.getElementsByTagName("item");

            for(int i = 0; i< nodeList.getLength(); i++){

                Node node = nodeList.item(i);
                Element fstElmnt = (Element) node;

                NodeList idx = fstElmnt.getElementsByTagName("idx");
                s += "idx = "+  idx.item(0).getChildNodes().item(0).getNodeValue() +"\n";

                NodeList gugun = fstElmnt.getElementsByTagName("gugun");
                s += "gugun = "+  gugun.item(0).getChildNodes().item(0).getNodeValue() +"\n";

                NodeList instt  = fstElmnt.getElementsByTagName("instt");
                s += "instt = "+ instt.item(0).getChildNodes().item(0).getNodeValue() +"\n";

                NodeList spot = fstElmnt.getElementsByTagName("spot");
                s += "spot = "+  spot.item(0).getChildNodes().item(0).getNodeValue() +"\n";

                NodeList spotGubun = fstElmnt.getElementsByTagName("spotGubun");
                s += "spotGubun = "+  spotGubun.item(0).getChildNodes().item(0).getNodeValue() +"\n";

                NodeList airPump = fstElmnt.getElementsByTagName("airPump");
                s += "airPump = "+  airPump.item(0).getChildNodes().item(0).getNodeValue() +"\n";

                NodeList updtDate = fstElmnt.getElementsByTagName("updtDate");
                s += "updtDate = "+  updtDate.item(0).getChildNodes().item(0).getNodeValue() +"\n";
            }

            textview.setText(s);

            super.onPostExecute(doc);
        }
    }


xml을 파싱하고 결과를 간단히 가공하여 표현하는 클래스입니다. (서비스키는 공개하지않았습니다. 예시용이라서요...)



이번 예제는 공공데이터 포털의 api를 사용하였는데요.


url 에 xml주소와 자신의 서비스키를 넣고 getElementsByTagName 으로 하나의 데이터항목인 item을 구분하여줍니다.


url 에는 요청메세지를 명세하여 보내는데요, 사용하고자하는 api 기술문서를 참고하면 더욱 원하는 정보를 손쉽게 찾을수 있습니다.


그런뒤 node 를 이용해 큰 항목구분의 자식 태그를 찾아 내가 원하는 값만 가공하여 사용하면됩니다.


json 과 xml 은 아주 많이쓰이고 유용하니 알아두면 좋을것같습니다.