마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

XmlPullParser 파싱 관련 문의드립니다.

0 추천

xml데이터가

 

-<leagues>
 
     <league feedContents="0" id="758">ESL Pro Series - Fifa 2010</league>
 
     <league feedContents="0" id="4681">Heroes Of Newerth World Cup</league>
 
     <league feedContents="0" id="759">Heroes of Newerth - Honcast Invitational</league>
 
     <league feedContents="0" id="10229">Hearthstone - BlizzCon World Championship</league>
.
.
.
 
 
이런식으로 돼 있는데
 
START_TAG 에서 태그를 뽑으면 league만 다 나오구요
TEXT 에서 텍스트를 뽑으면 가운데 String(ESL Pro Series .....) 만 출력됩니다.
 
feedContents와 id를 함께 뽑고싶은데 어떻게 하면 되나요 ?? 현재는
 
while (eventType != XmlPullParser.END_DOCUMENT) {
				if(eventType == XmlPullParser.START_TAG){ 
					if (!TextUtils.isEmpty(xpp.getName()) && xpp.getName().startsWith("leagues")) {
						while (eventType != XmlPullParser.END_DOCUMENT) {
							if (eventType == XmlPullParser.START_TAG) {
							}
							else if (eventType == XmlPullParser.TEXT) {
							}
							eventType = xpp.next();
						}
					}
				}
				eventType = xpp.next();
			}

 

이렇게 돼 있습니다.

 

음무 (17,820 포인트) 님이 2015년 1월 22일 질문

3개의 답변

0 추천
 
채택된 답변
아래 링크의 예제를 참고하시기 바랍니다.

http://seinarin.tistory.com/entry/Android-XmlPullPaser%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-xml%ED%8C%8C%EC%8B%B1

 

START_TAG가 league 일 때 xpp.getName()이 feedContents 인지 비교해서 xpp.getAttributeValue[0] 으로 가져오거나

xpp.getName()이 id인지 비교해서 xpp.getAttibuteValue[1]

이런식으로 가져오는 로직을 추가 하시면 됩니다.
Gradler (109,780 포인트) 님이 2015년 1월 23일 답변
음무님이 2015년 3월 4일 채택됨
xpp.getName(); 으로 태그명을 검색해서 뽑아보면 전부 league만 나옵니다..
그래서 문의드렸습니다
스타트태그가 league 일때 getAttributeValue[1] 을 해주려니 이런 메소드가 없다고하구요 ..
if (!TextUtils.isEmpty(xpp.getName()) && xpp.getName().startsWith("league")) {
                        try {
                            Log.d("fureun", "" + xpp.getAttributeName(1));
                        }
                        catch (Exception e) {
                           
                        }

이렇게 해주니 로그로 feedContents 가 나오네요
그런데 feedContents 의 값을 뽑는것과
1이아니라 2로 해주면 id가 뽑힐줄알았는데 익셉션이 발생하네요 ..
조언좀부탁드립니다.
제가 위에 찍어드린 링크 코드에다가 질문자님이 올리신 xml 복붙 해서 다음과 같이 적용해보니 잘 됩니다만...
본인이 이해가 잘 안가는 부분을 정확하게 질문하시는것이 좋을 듯 합니다.

XmlPullParser parser = getResources().getXml(R.xml.test);
            while (parser.getEventType() != XmlPullParser.END_DOCUMENT) {
                String name = parser.getName();
                if (parser.getEventType() == XmlPullParser.START_TAG) {
                    Log.i(TAG, "parser.getName() : " + name);
                    if (parser.getName().equals("league")) {
                        Log.i(TAG, "parser.getAttributeValue(0) : " + parser.getAttributeValue(0));
                        Log.i(TAG, "parser.getAttributeValue(1) : " + parser.getAttributeValue(1));
                    }
                } else if (parser.getEventType() == XmlPullParser.TEXT) {
                    Log.i(TAG, "parser.getText() : " + parser.getText());
                }
                parser.next();
            }
실행 결과 :

01-23 16:50:19.496: I/[MainActivity](21863): parser.getName() : leagues
01-23 16:50:19.496: I/[MainActivity](21863): parser.getName() : league
01-23 16:50:19.496: I/[MainActivity](21863): parser.getAttributeValue(0) : 0
01-23 16:50:19.496: I/[MainActivity](21863): parser.getAttributeValue(1) : 758
01-23 16:50:19.496: I/[MainActivity](21863): parser.getText() :  ESL Pro Series - Fifa 2010
01-23 16:50:19.496: I/[MainActivity](21863): parser.getName() : league
01-23 16:50:19.496: I/[MainActivity](21863): parser.getAttributeValue(0) : 0
01-23 16:50:19.496: I/[MainActivity](21863): parser.getAttributeValue(1) : 4681
01-23 16:50:19.496: I/[MainActivity](21863): parser.getText() :     Heroes Of Newerth World Cup
01-23 16:50:19.496: I/[MainActivity](21863): parser.getName() : league
01-23 16:50:19.496: I/[MainActivity](21863): parser.getAttributeValue(0) : 0
01-23 16:50:19.496: I/[MainActivity](21863): parser.getAttributeValue(1) : 759
01-23 16:50:19.496: I/[MainActivity](21863): parser.getText() :     Heroes of Newerth - Honcast Invitational
01-23 16:50:19.496: I/[MainActivity](21863): parser.getName() : league
01-23 16:50:19.496: I/[MainActivity](21863): parser.getAttributeValue(0) : 0
01-23 16:50:19.496: I/[MainActivity](21863): parser.getAttributeValue(1) : 10229
01-23 16:50:19.496: I/[MainActivity](21863): parser.getText() :     Hearthstone - BlizzCon World Championship
+1 추천
속성값 가져오는 것은 getAttributeValue 메소드로 가져올 수 있습니다.

 

그런데 현재 파싱하는 코드가 이상하네요., while문으로 xml 파싱 돌리면서

START_TAG 일때 왜 또 다시 while문을 돌리는 지요?

그리고 조건도 잘못주신것 같네요.

 

xmlpullparser는 xml을 처음부터 순차적으로 읽어가며 파싱합니다.

각 이벤트 상황에 맞게 값을 가져오시면 됩니다.
원조안드로이드 (58,190 포인트) 님이 2015년 1월 23일 답변
0 추천
저라면 더 쉬운 xml 파서를 쓸 것 같아요

 

https://github.com/BLamy/RaptureXML-Java
쎄미 (162,410 포인트) 님이 2015년 1월 23일 답변
...