안드로이드 개발 질문/답변
(글 수 45,052)
제리코 파싱을 하는데여
현재 URI 주소를 통해서 파싱을 하고잇습니다.
하지만 인터넷이 안될경우를 대비해서 그것을 이클립스내에 html문서를 만들어놓고 그파일에서
파싱을 하고 싶습니당.
방법을 아예 모르겠습니당 도와주세여.
소스는 이렇습니당.
/**
* 파싱하는 메소드, 부서명을 담은 리스트객체와 부서내의 직원을 담은 해쉬맵 객체
*/
private void useJerico() {
String uri = "http://www.dongseo.ac.kr/01_intro/intro_11_2.php";
try {
URL sUrl = new URL(uri);
InputStream is = sUrl.openStream();
Source source = new Source(new InputStreamReader(is, "euc-kr"));
source.fullSequentialParse();
TITLE = new ArrayList<String>();
;
PERSON = new HashMap<Integer, ArrayList<Person>>();
// Tbody 기준으로 파싱
List<Element> rootList = source
.getAllElements(HTMLElementName.TBODY);
int depthCnt = 0; // 해당 부서별 인덱스
for (Iterator it = rootList.iterator(); it.hasNext();) {
Element pElement = (Element) it.next();
// TD기준 파싱
List<Element> tdList = pElement
.getAllElements(HTMLElementName.TD);
// 해당 개인별 정보를 담은 개체 세팅
int pCnt = 0; // person 객체를 담을 카운트
Person p = null;
ArrayList<Person> ap = new ArrayList();
String rowContent = "";
int rowCnt1 = 0;
int rowCnt2 = 0;
String addName = null;
for (Element tdElement : tdList) {
String colspan = tdElement.getAttributeValue("colspan");
String style = tdElement.getAttributeValue("class");
String align = tdElement.getAttributeValue("align");
String rowspan = tdElement.getAttributeValue("rowspan");
String content = tdElement.getContent().getTextExtractor()
.toString();
if (content.equals("부서") || content.equals("번호"))
continue;
// rowspan 대응
if (rowspan != null) {
// <td>2개 형태의 rowspan <td><td rowspan>숫자
if (isNumber(content.substring(0, 1))) {
rowCnt1 = Integer.parseInt(rowspan);
}
// <td> 3개 형태의 rowspan ex> <td rowspan>문자<td><td>
if (!isNumber(content.substring(0, 1))) {
rowCnt2 = Integer.parseInt(rowspan);
addName = content;
continue; // rowspan안의 값을 저장하고 나서 그다음 루프로.
}
}
// <td> 2개 구조 기본폼 ex> <td>총장실</td><td>1588</td>
if (colspan == null && align.equals("center")) {
if (pCnt == 0) { // <td> 첫번째
p = new Person();
if (rowCnt2 > 0) { // rowspan 갯수를 체크하여 그 수만큼 그 다음
// TD에 값을 붙입니다.
p.setName(addName + " " + content); // ex> 입시관리처
// + " " +
// 부처장
rowCnt2--; // rowCnt2 갯수를 줄입니다.
} else {
p.setName(content);
}
pCnt++;
if (rowCnt1 > 0) { // 로스판 만큼 값을 넣는다.
p.setNumber(rowContent);
ap.add(p);
rowCnt1--;
pCnt = 0;
}
} else { // 그 다음 <td>
p.setNumber(content);
ap.add(p);
pCnt = 0;
if (rowCnt1 > 0) {
rowContent = content;
}
}
// 부서타이틀 입력
} else if (colspan != null
&& (colspan.equals("2") || colspan.equals("3"))
&& style != null && style.equals("style2")) {
TITLE.add(content);
// <td colspan=2 align="center"> 타입 에 설정 <td> 2개 타입으로 이동
} else if (colspan != null && colspan.equals("2")
&& align.equals("center")) {
p = new Person();
p.setName(content);
pCnt++;
}
}
PERSON.put(Integer.valueOf(depthCnt), ap);
depthCnt++; // 부서별 인덱싱
}
} catch (MalformedURLException e) {
Log.w("tel", e);
} catch (IOException e) {
Log.w("tel", e);
}
}
현재 URI 주소를 통해서 파싱을 하고잇습니다.
하지만 인터넷이 안될경우를 대비해서 그것을 이클립스내에 html문서를 만들어놓고 그파일에서
파싱을 하고 싶습니당.
방법을 아예 모르겠습니당 도와주세여.
소스는 이렇습니당.
/**
* 파싱하는 메소드, 부서명을 담은 리스트객체와 부서내의 직원을 담은 해쉬맵 객체
*/
private void useJerico() {
String uri = "http://www.dongseo.ac.kr/01_intro/intro_11_2.php";
try {
URL sUrl = new URL(uri);
InputStream is = sUrl.openStream();
Source source = new Source(new InputStreamReader(is, "euc-kr"));
source.fullSequentialParse();
TITLE = new ArrayList<String>();
;
PERSON = new HashMap<Integer, ArrayList<Person>>();
// Tbody 기준으로 파싱
List<Element> rootList = source
.getAllElements(HTMLElementName.TBODY);
int depthCnt = 0; // 해당 부서별 인덱스
for (Iterator it = rootList.iterator(); it.hasNext();) {
Element pElement = (Element) it.next();
// TD기준 파싱
List<Element> tdList = pElement
.getAllElements(HTMLElementName.TD);
// 해당 개인별 정보를 담은 개체 세팅
int pCnt = 0; // person 객체를 담을 카운트
Person p = null;
ArrayList<Person> ap = new ArrayList();
String rowContent = "";
int rowCnt1 = 0;
int rowCnt2 = 0;
String addName = null;
for (Element tdElement : tdList) {
String colspan = tdElement.getAttributeValue("colspan");
String style = tdElement.getAttributeValue("class");
String align = tdElement.getAttributeValue("align");
String rowspan = tdElement.getAttributeValue("rowspan");
String content = tdElement.getContent().getTextExtractor()
.toString();
if (content.equals("부서") || content.equals("번호"))
continue;
// rowspan 대응
if (rowspan != null) {
// <td>2개 형태의 rowspan <td><td rowspan>숫자
if (isNumber(content.substring(0, 1))) {
rowCnt1 = Integer.parseInt(rowspan);
}
// <td> 3개 형태의 rowspan ex> <td rowspan>문자<td><td>
if (!isNumber(content.substring(0, 1))) {
rowCnt2 = Integer.parseInt(rowspan);
addName = content;
continue; // rowspan안의 값을 저장하고 나서 그다음 루프로.
}
}
// <td> 2개 구조 기본폼 ex> <td>총장실</td><td>1588</td>
if (colspan == null && align.equals("center")) {
if (pCnt == 0) { // <td> 첫번째
p = new Person();
if (rowCnt2 > 0) { // rowspan 갯수를 체크하여 그 수만큼 그 다음
// TD에 값을 붙입니다.
p.setName(addName + " " + content); // ex> 입시관리처
// + " " +
// 부처장
rowCnt2--; // rowCnt2 갯수를 줄입니다.
} else {
p.setName(content);
}
pCnt++;
if (rowCnt1 > 0) { // 로스판 만큼 값을 넣는다.
p.setNumber(rowContent);
ap.add(p);
rowCnt1--;
pCnt = 0;
}
} else { // 그 다음 <td>
p.setNumber(content);
ap.add(p);
pCnt = 0;
if (rowCnt1 > 0) {
rowContent = content;
}
}
// 부서타이틀 입력
} else if (colspan != null
&& (colspan.equals("2") || colspan.equals("3"))
&& style != null && style.equals("style2")) {
TITLE.add(content);
// <td colspan=2 align="center"> 타입 에 설정 <td> 2개 타입으로 이동
} else if (colspan != null && colspan.equals("2")
&& align.equals("center")) {
p = new Person();
p.setName(content);
pCnt++;
}
}
PERSON.put(Integer.valueOf(depthCnt), ap);
depthCnt++; // 부서별 인덱싱
}
} catch (MalformedURLException e) {
Log.w("tel", e);
} catch (IOException e) {
Log.w("tel", e);
}
}