안드로이드 개발 질문/답변
(글 수 45,052)
웹에서 정보를 얻어오고있습니다. 웹 정보는 …. <script type="text/javascript" src="/js/glip0.js"></script> <script type="text/javascript" src="/js/common.js"></script> <script type="text/javascript" src="/js/csp0.js"></script> <script type="text/javascript" src="/js/searchEngi.js"></script> <script type="text/javascript"> function fOpenCnpDataPop(url, csmSeq, ccfNo, cciNo){ url += "?csmSeq=" + csmSeq + "&ccfNo=" + ccfNo + "&cciNo=" + cciNo; popupScroll2(url, 'info',793, 643); } function cciChOn(cciId,cciLiId){ document.getElementById(cciId).className="on"; document.getElementById(cciLiId).className="me03"; } …..
제가 웹에서 정보를 읽는 방법으로 두가지 방법을 사용하였는데요.
경우1.
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.web); textview = (TextView)findViewById(R.id.text); try { URL url = new URL("http://oneclick.law.go.kr/CSP/CcfMain.laf?csmSeq=27&ccfNo=1&cciNo=1"); InputStream inputstream = url.openStream(); byte[] text = new byte[1000]; int readSize = inputstream.read(text); Log.d("myTag","read size : " + readSize); Log.d("myTag", "text : "+(new String(text))); textview.setText(new String(text)); inputstream.close(); } catch (Exception e) { Log.d("myTag",e.getMessage()); e.printStackTrace(); } }
이 방법을 쓰는 경우
1. <script type="text/javascript">
2. function fOpenCnpDataPop(url, csmSeq, ccfNo, cciNo){
부분에서 1에서 2로 넘어갈때 xml이 END_DOCUMENT가 된 것으로 인식되어
그 뒤의 데이터를 읽어야하기때문에 사용을 하지 못하구요.
경우2.
URL url = new URL("http://oneclick.law.go.kr/CSP/CcfMain.laf?csmSeq=27&ccfNo=1&cciNo=1"); Log.d("myTag", "create URL"); // XmlPullParser 생성 가능한 XmlPullParserFactory 생성 XmlPullParserFactory parserCreator = XmlPullParserFactory.newInstance(); // 최근 생성된 XmlPullParserFactory의 특징을 갖는 XmlPullParser XmlPullParser parser = parserCreator.newPullParser(); // URL로부터 받은 input stream을 perser에 넣음 parser.setInput(url.openStream(), null); // parser 이벤트의 상태를 받아옴 // START_TAG, END_TAG, TEXT... int parserEvent = parser.getEventType(); while (parserEvent != XmlPullParser.END_DOCUMENT){ // start case if(parserEvent == XmlPullParser.START_TAG){ // Parser가 START_TAG String tag = parser.getName(); // xml tag 받아옴 Log.d("myTag", tag); if (tag.compareTo("<div class=\"sooyo_text\">") == 0){ // 생활분야 이름 tag 찾기 parserEvent = parser.next(); text = parser.getText(); // tag 내의 text 받아옴 //Log.d("myTag", list_num + " : receive life part name"); Log.d("myTag", "Success read Xml"); textview.setText(text); break; } } parserEvent = parser.next(); }
이런식으로 읽어오려고 시도를 하였는데,
<div class="sooyo_text"> 흔히 프랜차이즈사업이라 ......
용품, 등산용품, 학원 등의 분야로 계속 확대되고 있습니다.<br /><br /><br /></div>이부분을 따로 빼오기가 stringtoknizer를 사용하여도 빼오기가 난감하여 고생하고있습니다.
어떤 방법을 써야할까요?
2010.03.20 17:58:47
일단 HTML을 XML 파서로 분석해서는 안됩니다.
XML에 가장 가까운 HTML은 XHTML인데, XHTML조차도 well-form문서가 아닌이상 정확한 xml문서라고 취급될 수 없기 때문입니다.
HTML를 분석하는 파서를 따로 작성하시는것이 가장 좋습니다.
제일 좋은것은 정규표현식을 사용하시는건데, 여유치 않으시면 그냥 다음과 같이 써도 무방합니다.
int startIndex = sb.indexOf("<div class=\"sooyo_text\">");
int endIndex = sb.indexOf("</div>", startIndex);
CharSequence sub = sb.subSequence(startIndex + "<div class=\"sooyo_text\">".length(), endIndex);