안녕하세요.
이번에는 json파싱에 이어 xml파싱을 알아보겠습니다.
이번에도 간단한 예제를 통하여 알아볼건데요.
json 이나 xml 이나 tag를 구분하여 내가 원하는값을 찾는건 같습니다.
하지만 어떤 값인가에 따라 파싱하는 방법이 다른데요.
xml은 말 그대로 xml 형식의 파일을 파싱할때 쓰입니다.
<items>
보이는 예제가 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 은 아주 많이쓰이고 유용하니 알아두면 좋을것같습니다.
'Android' 카테고리의 다른 글
[안드로이드]커스텀리스트뷰(listview) (2) | 2017.11.22 |
---|---|
[안드로이드]퀵액션(QuickAction)(말풍선버튼) (3) | 2017.09.06 |
[안드로이드]xml파싱(xml parser) (6) | 2017.09.04 |
[안드로이드]JSON파싱(json parser) (8) | 2017.09.04 |
[안드로이드]인텐트 로 값 전달(Intent putExtra) (0) | 2017.08.30 |
[안드로이드]커스텀 zxing(custom바코드스캐너) (57) | 2017.08.29 |
doc부분에서 에러가 나는데 이부분 어떻게 해결하나요
혹시 두개의 태그에서 데이터를 가져오려면 어떻게 해야할까요??
제대로 코딩해서 올려라 ㅡㅡ 변수를 선언하지도 않고 담고있어
getBaseContext()랑 마지막에 textview 안되는데 어떻게 해야하나요ㅠ
안된다이거야
onPostExcute의 파라미터가 Document doc인 것을 보아 doc는 Document 타입의 변수입니다