게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
android xml 파싱 질문드립니다!!! ㅠ_ㅠ 능력자분들 도와주세요
게시물ID : programmer_12124짧은주소 복사하기
작성자 : 뿌뿌빠뿌뿌
추천 : 0
조회수 : 1756회
댓글수 : 8개
등록시간 : 2015/07/15 22:19:46
옵션
  • 본인삭제금지
xml 파일을 받아와서 string 변수에 저장을 하였습니다.
이제 내부에서 가공을 통해서 화면에 보여주려고 하는데 문제가 생겼습니다 ㅠㅠ
---------------------------------
xml 파일 요약??? 본 입니다.

<?xml version="1.0"encoding="utf-8"standalone="yes"?>
<ServiceResult>
<comMsgHeader/>
<msgHeader>
<headerCd> 0 </headerCd> 
<headerMsg> 정상적으로 처리되었습니다. </headerMsg>
<itemCount> 0 </itemCount>
</msgHeader>
<msgBody>
<itemList>
<distance> 7767 </distance>
<pathList> 
<fid> 291030 </fid>
<fname> 성북 </fname>
<fx> 127.06148934414729 </fx>
<fy> 37.673810520367776 </fy>
<railLinkList>
<railLinkId> 840 </railLinkId>
</railLinkList>
<railLinkList>
<railLinkId> 222 </railLinkId>
</railLinkList>
쭉쭉쭉 몇개 반복
<routeNm> 경원선 </routeNm>
<tid> 창동 </tid>
<tname> 창동 </tname>
<tx> ~~~~~~~ </tx>
<ty> ~~~~~~~ </ty>
</pathList>
<pathList>
... 반복
</pathList>
<time> 31 </time>
</itemList>
</msgBody>
</ServiceResult>
----------------------------------------------------
여기서 제가 원하는 정보는 거리(distance), 경로(pathList), 시간(time) 정보 입니다.
여기서 경로 정보에는 시작점과 도착점의 id, 이름, x, y좌표가 있고, 
railLinkList라는... 출발점과 도착점의 x,y 좌표에 따라서 갯수가 가변적으로 변화하는 내용이 들어가 있습니다.

인터넷에 xml 파서와 관련된 예제를 봐도, depth가 1이고, 갯수가 가변적으로 늘어나는 경우도 없어서 바로 응용하여 사용하기가 매우 어렵습니다 ㅠ
내일까지 완성이 되어야 하는 부분이어서... 이론상으로는 생각이 되어도 실제로 구현하려니까 막막하네요 ㅠㅠ 코드 쓰면서도 의구심이 들고...ㅠ
조언 부탁드립니다!

-----------------------------------------
//XmlParser 20150715 추가
private void PullParserFromXML(String data){
boolean boolean_distance = false, boolean_itemList = false,
//PathList
boolean_pathList = false,
boolean_fId = false,
boolean_fName = false,
boolean_fX = false, 
boolean_fY = false,
boolean_railLinkList = false,
boolean_railLinkId = false,
boolean_routeNm = false,
boolean_tId = false,
boolean_tName = false,
boolean_tX = false,
boolean_tY = false,
//pathList end. 배열로 해줘야할듯
boolean_time = false;
//itemList 끝 
boolean done = false;
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser parser = factory.newPullParser();
parser.setInput(new StringReader(data));
String sTag;
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT){
switch(eventType){
case XmlPullParser.START_DOCUMENT : 
subwayList = new ArrayList<SubwayData>(); break;
case XmlPullParser.END_DOCUMENT : break;
case XmlPullParser.START_TAG :
sTag = parser.getName();
if (sTag.equals("msgBody"));
if (sTag.equals("itemList")){
subwayData = new SubwayData(); // 객체 생성
boolean_itemList = true;
}
if (sTag.equals("distance"))
boolean_distance = true;
if (sTag.equals("pathList"))
subwayPathList = new ArrayList<SubwayPathList>(); //뭉텅이
// subwayPath = new SubwayPathList();
if (sTag.equals("fid"))
boolean_fId = true;
else if (sTag.equals("fname"))
boolean_fName = true;
else if (sTag.equals("fx"))
boolean_fX = true;
else if (sTag.equals("fy"))
boolean_fY = true;
/**
* 일단 rail 부분은 파싱하지 말고 나머지가 정상적으로 되나 테스트를 하자.
else if (sTag.equals("railLinkList")){
railLinkList = new RailLinkList();
while (sTag.equals("railLinkId")){
boolean_railLinkId = true;
} boolean_railLinkList = true;
}
*/
else if (sTag.equals("routeNm"))
boolean_routeNm = true;
else if (sTag.equals("tid"))
boolean_tId = true;
else if (sTag.equals("tname"))
boolean_tName = true;
else if (sTag.equals("tX"))
boolean_tX = true;
else if (sTag.equals("tY"))
boolean_tY = true;
if (sTag.equals("time"))
boolean_time = true;
break; //XmlPullParser.START_TAG case close
case XmlPullParser.END_TAG :
sTag = parser.getName();
if (sTag.equalsIgnoreCase("itemList") && subwayData != null)
if (sTag.equalsIgnoreCase("pathList") && subwayPathList != null)
subwayPathList.add(subwayPath);
subwayList.add(subwayData);
break;
case XmlPullParser.TEXT : 
if (boolean_distance){
subwayData.setDistance(parser.getText());
boolean_distance = false;
} else if (boolean_pathList){
//? 추가해야할 것? 맨 마지막에 false 하자
if (boolean_fId){
// subwayData.setPathList(); how to ㅠㅠ 
subwayPath.setfId(parser.getText());
boolean_fId = true;
} else if (boolean_fName){
subwayPath.setfName(parser.getText());
boolean_fName = true;
} else if (boolean_fX){
subwayPath.setfX(parser.getText());
boolean_fX = true;
} else if (boolean_fY){
subwayPath.setfY(parser.getText());
boolean_fY = true;
} // railLinkList 추가해야해  
else if (boolean_routeNm){
subwayPath.setRouteNm(parser.getText());
boolean_routeNm = true;
} else if (boolean_tId){
subwayPath.setTid(parser.getText());
boolean_tId = true;
} else if (boolean_tName){
subwayPath.settName(parser.getText());
boolean_tName = true;
} else if (boolean_tX){
subwayPath.settX(parser.getText());
boolean_tX = true;
} else if (boolean_tY){
subwayPath.settY(parser.getText());
boolean_tY = true;
// subwayData.setPathList ?? 세팅하는게 필요할듯한데..
boolean_pathList = false;
} else if (boolean_time){
subwayData.setTime(parser.getText());
boolean_time = false; break;
eventType = parser.next();
}//switch close
Log.i("xmlParser", subwayData.getDistance() + "" + subwayData.getPathList());
TextView data1 = (TextView)findViewById(R.id.data1);
TextView data2 = (TextView)findViewById(R.id.data2);
TextView data3 = (TextView)findViewById(R.id.data3);
data1.setText(subwayPath.getfName());
data2.setText(subwayData.getDistance());
data3.setText(subwayData.getPathList().get(0).gettName());
}
        } catch(Exception ex) {
               
        }
}
--------------------------------------------
작성하다 만 코드입니다. 
데이터의 큰 틀을 SubwayData라고 두면 그 내부의 변수인 distance와 time 값은 넣을 수 있습니다.
그런데 이제 새로운 클래스인 SubwayPathList에서 객체를 생성하며 데이터를 담으면, 그 내용을 SubwayData에 담으려고 했는데..
음.. 아무튼 TextView에 값이 제대로 담겼는지 확인하기 위해서 저렇게 임의로 코드를 넣어서 테스트해봤는데 결과가 나오지 않아요 ㅠㅠ 

--------------------------------
public class SubwayData {
String distance;
ArrayList<SubwayPathList> pathList; // 배열로 하는게 맞는지?
String time;
//getter setter 생략
}
class SubwayPathList {
String fId;
String fName;
String fX, fY;
RailLinkList railLinkList; // 이건 일단 제외하고 테스트했습니다. ㅠㅠ 어떻게 사용해야할까요?
String routeNm;
String tid;
String tName;
String tX, tY;
//getter setter 생략
}
class RailLinkList {
String railLinkId;
//getter setter 생략
}
-------------------------------------------

Logcat 입니다.

07-15 22:16:27.307: W/ApplicationPackageManager(26472): getCSCPackageItemText()
07-15 22:16:27.307: I/PersonaManager(26472): getPersonaService() name persona_policy
07-15 22:16:27.377: I/dalvikvm(26472): Could not find method android.content.res.TypedArray.getChangingConfigurations, referenced from method android.support.v7.internal.widget.TintTypedArray.getChangingConfigurations
07-15 22:16:27.377: W/dalvikvm(26472): VFY: unable to resolve virtual method 405: Landroid/content/res/TypedArray;.getChangingConfigurations ()I
07-15 22:16:27.377: D/dalvikvm(26472): VFY: replacing opcode 0x6e at 0x0002
07-15 22:16:27.377: I/dalvikvm(26472): Could not find method android.content.res.TypedArray.getType, referenced from method android.support.v7.internal.widget.TintTypedArray.getType
07-15 22:16:27.377: W/dalvikvm(26472): VFY: unable to resolve virtual method 427: Landroid/content/res/TypedArray;.getType (I)I
07-15 22:16:27.377: D/dalvikvm(26472): VFY: replacing opcode 0x6e at 0x0002
07-15 22:16:27.417: I/dalvikvm(26472): Could not find method android.content.res.Resources.getDrawable, referenced from method android.support.v7.internal.widget.ResourcesWrapper.getDrawable
07-15 22:16:27.417: W/dalvikvm(26472): VFY: unable to resolve virtual method 368: Landroid/content/res/Resources;.getDrawable (ILandroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;
07-15 22:16:27.417: D/dalvikvm(26472): VFY: replacing opcode 0x6e at 0x0002
07-15 22:16:27.417: I/dalvikvm(26472): Could not find method android.content.res.Resources.getDrawableForDensity, referenced from method android.support.v7.internal.widget.ResourcesWrapper.getDrawableForDensity
07-15 22:16:27.417: W/dalvikvm(26472): VFY: unable to resolve virtual method 370: Landroid/content/res/Resources;.getDrawableForDensity (IILandroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;
07-15 22:16:27.417: D/dalvikvm(26472): VFY: replacing opcode 0x6e at 0x0002
07-15 22:16:27.467: I/Adreno-EGL(26472): <qeglDrvAPI_eglInitialize:410>: EGL 1.4 QUALCOMM build:  ()
07-15 22:16:27.467: I/Adreno-EGL(26472): OpenGL ES Shader Compiler Version: E031.24.00.08+13
07-15 22:16:27.467: I/Adreno-EGL(26472): Build Date: 03/20/14 Thu
07-15 22:16:27.467: I/Adreno-EGL(26472): Local Branch: 0320_AU200_patches
07-15 22:16:27.467: I/Adreno-EGL(26472): Remote Branch: 
07-15 22:16:27.467: I/Adreno-EGL(26472): Local Patches: 
07-15 22:16:27.467: I/Adreno-EGL(26472): Reconstruct Branch: 
07-15 22:16:27.517: D/OpenGLRenderer(26472): Enabling debug mode 0
07-15 22:16:37.597: W/System.err(26472): [DEBUG] GbaRequest - GbaRequest: Constructor Called 222 userAgent Apache-HttpClient/UNAVAILABLE (java 1.4)
07-15 22:16:37.597: W/System.err(26472): [DEBUG] NafRequest - NafRequest: NafRequest constructor===useragent Apache-HttpClient/UNAVAILABLE (java 1.4)
07-15 22:16:38.237: I/System.out(26472): AsyncTask #1 calls detatch()
07-15 22:16:45.167: W/System.err(26472): [DEBUG] GbaRequest - GbaRequest: Constructor Called 222 userAgent Apache-HttpClient/UNAVAILABLE (java 1.4)
07-15 22:16:45.167: W/System.err(26472): [DEBUG] NafRequest - NafRequest: NafRequest constructor===useragent Apache-HttpClient/UNAVAILABLE (java 1.4)
07-15 22:16:45.737: I/System.out(26472): AsyncTask #2 calls detatch()
07-15 22:17:01.287: W/System.err(26472): [DEBUG] GbaRequest - GbaRequest: Constructor Called 222 userAgent Apache-HttpClient/UNAVAILABLE (java 1.4)
07-15 22:17:01.287: W/System.err(26472): [DEBUG] NafRequest - NafRequest: NafRequest constructor===useragent Apache-HttpClient/UNAVAILABLE (java 1.4)
07-15 22:17:01.847: I/System.out(26472): AsyncTask #3 calls detatch()
07-15 22:17:03.697: W/System.err(26472): [DEBUG] GbaRequest - GbaRequest: Constructor Called 222 userAgent Apache-HttpClient/UNAVAILABLE (java 1.4)
07-15 22:17:03.697: W/System.err(26472): [DEBUG] NafRequest - NafRequest: NafRequest constructor===useragent Apache-HttpClient/UNAVAILABLE (java 1.4)
07-15 22:17:04.247: I/System.out(26472): AsyncTask #4 calls detatch()

전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호