XmlPullParser 를이용하여 데이터 가져와보기!!

by 조쉬 posted Aug 28, 2014
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄

옮겨 놓다가 보니자꾸 안되서 애먹었는데,, 이상하게 네트워크관련해서 

Manifest 요부분에서 

<uses-sdk

  android:target~~/>어쩌구 부분을 지웠더니 된다. 

xml 파싱할때도 네트워킹이니까 주의 하도록해야겠다.

 

xml파서를 하다보니 참이상하게도,, xml데이터가안열리네,,,,이건뭔지

나의 데이터형식은

<item>

<title>~~~~`</title>

<link>~~</link>

</item>

 

<item>

<title>~~~~`</title>

<link>~~</link>

</item>

 

<item>

<title>~~~~`</title>

<link>~~</link>

</item>

.....

이런형식이었는데 자꾸 열면 인터넷상에서 에러가났다.흠 가장상위 태그는 하나만해야되서그런건가??,,, 그래서 고쳐보니

 

<item>

<title>~~~</title>

<link>~~~</link>

 

 

<title>~~~</title>

<link>~~~</link>

 

 

<title>~~~</title>

<link>~~~</link>

</item>

이런식으로 고치니까 웹상에서 문제없이 잘됫다. 이것 또한 참고해야겠다. 일단 오늘은 xml파싱으로 데이터를 가져오는 연습을했는데 이것도 안되다가 되서 너무좋다 ㅜㅜ 근데 옛날꺼라 참고한 곳의 링크가 다사라져버렸네 ㅜㅜ(능력자님들죄송합니다 ㅜㅜ)

 

import java.io.InputStream;

import java.net.URL;

import java.util.ArrayList;

 

import org.xmlpull.v1.XmlPullParser;

import org.xmlpull.v1.XmlPullParserFactory;

 

import android.os.Bundle;

import android.app.Activity;

import android.util.Log;

import android.view.Menu;

import android.widget.TextView;

 

public class XMLText extends Activity{

//여기다가 내가 파싱한것중 title만 뽑아서 가져올것이다. 후에 어레이로변환해서 데이터로 쓰기에는 너무좋은 방법인것같다.

ArrayList<String> titleList;

 

@Override

protected void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_xmltest);

 

String Buffer sb=new StringBuffer();

TextView text=(TextView) findViewById(R.id.text);

//xml파싱시작해야디!!일단 getXmlData()란메소드를 호출하여 데이터가져올것이다.

titleList=getXmlData();

 

for(int i=0;i<titleList.size();i++)}

sb.append(titleList.get(i)).append("\n\n");

}

text.setText(sb.toString());

}

//파싱할것들을 정의해보자 

private ArrayList<String> getXmlData(){

String res="이부분은 내가가져올 서버의 xml이담긴곳의주소를입력한다.";

titleList=new ArrayList<String>();

 

try{//일단 PullParser 인스턴스하나먼저 가져오자

XmlPullParserFactory factory=XmlPullParserFactory.newInstance();

//이것은 네임스페이스를 인지할건지 말건지를 고른다 일단 나는인지하는것으로 했고 디폴트값은 false 이다.

참고하자.이부분에서 네임스페이스에대한내용이상세하다 

blog.naver.com/hkpking?Redirec=Log&logNo=30134247888 (감사합니다.능력자님)

factory.setnamespaceAware(true);

//그뒤에 factory로하여금 pullparser를 가져온다.

XmlPullParser xpp=factory.newPullParser();

//내가지정한 유알엘로 들어가고 

URL url=new URL(res);

//이부분에서 고생을 많이했는데, 역시나 문제는

Manifest에서 INTERNET허용 그리고 책에서 보면 null이 아닌 인코딩값이있는데 내컴퓨터가이상한건지 utf-8이런거하면안된다,,,그래서나는 null

xpp.setInput(url.openStream(),null);

//이것 xml로하여금 데이터를 찾기위해쓰는것이다.

int eventType=xpp.getEventType();

//만약에 데이터가 끝까지가지않았으면 그냥돌아라 라는얘기

while(eventType!=XmlPullParser.END_DOCUMENT){

//만약에 태그가 처음시작되는지점이라면 

if(eventType==XmlPullParser.START_TAG){

//그리고 그태그가 title이면 

if(xpp.getName().equalsIgnoreCase("title"){

//가져오자 그리고넘어가자 정말 좋은것 같다. 

nextText()요녀석이 2개의 역활이나하니까 ㅋ

String title=xpp.nextText();

titleList.add(title);

}

}

//첫번째 메인 태그가 돌았으면 이제그다음태그로간다.

eventType=xpp.next();

}

}catch(Exception e){

e.printStackTrace();

Log.d("asd",e.getMessage());

}

return titleList;

}

}

오늘 xml파싱도 성공!! 아무튼 로직보면 titleList궂이 전역선언안해도 되는데,,그냥이것저것 수정하다보니,,좀무의만 코드가 되었다... 하지만 ㅋ뭐실행잘되니,,, 나중에 한꺼번에 고칠때는 더효율적인 코드로 가야지 ,,!!!

이상열정남이었습니다. 사랑합니다!!