우왕 짜증나........
한 20분 걸려서 다 작성했더니 금칙어 있다고 증발........
예전 문피아는 붙여넣기하면 되는 거였는데..........
--
지금부터 언급할 기술적 내용은, 사실 저도 100% 이해하고 있는 부분이 아니기에 뭔가 어설픈 해설을 동반할 것이며 현재 문피아 사이트는 아래 예시로 들 사이트와는 전혀 다른 언어로 만들어졌다고 예상되기에, 아래 기술은 전혀 적용하지 못할 가능성이 높습니다. 허나 기본적으로 모바일페이지와 앱을 고려했다면, 아래 기술을 적용할 수 있다는 조건 하에 그것의 제작은 그리 어렵지 않다는 것을 보여드리기 위함입니다.
그럼 일단은 해설 이전에 본문 전체를 보여드리겠습니다.
(layout.xml도 있지만 별로 중요하지 않기에 보여드리지 않겠습니다.)
(유알엘-이 금칙어라고 해서, 원래 영어로 써진 모든 부분을 ‘유알엘’로 치환하였습니다.)
public class MainActivity extends Activity {
TextView hello;
TextView txtText, txtDate, txtTemp;
LinearLayout layout1;
ImageView Imgicon;
String strText, strDate, strTemp, strImg;
Map<String,String> map=new HashMap<String,String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
hello=(TextView)findViewById(R.id.hello);
txtDate=(TextView)findViewById(R.id.txtDate);
txtTemp=(TextView)findViewById(R.id.txtTemp);
txtText=(TextView)findViewById(R.id.txtText);
layout1=(LinearLayout)findViewById(R.id.layout1);
Imgicon=(ImageView)findViewById(R.id.imgview);
try {
String str유알엘="http://weather.yahooapis.com/forecastrss?w=1132599&u=c";
Log.i("test", "----------------------------------1");
유알엘 유알엘=new 유알엘(str유알엘);
Log.i("test", "----------------------------------2");
InputStream is=유알엘.openStream();
XmlPullParserFactory f=XmlPullParserFactory.newInstance();
XmlPullParser parser=f.newPullParser();
parser.setInput(is, "euc-kr");
int event=parser.getEventType();
myparsing(event, parser);
hello.setText(map.get("text"));
hello.setTextSize(15);
if(is!=null){
is.close();
}
txtDate.append(map.get("date"));
txtText.append(map.get("text"));
txtTemp.append(map.get("temp"));
strImg=map.get("code");
//String imgsrc="http://l.yimg.com/a/i/us/we/52/"+strImg+".gif";
//getImage(imgsrc);
} catch (Exception e) {
e.printStackTrace();
}
}//oncreate
//이미지 스트림을 연갈하여 얻어와서 이미지뷰에 보여주고 이미지뷰를 동적으로 layout1에 추가하는 메소드
/* public void getImage(String imgsrc) throws Exception{
유알엘 유알엘=new 유알엘(imgsrc);
InputStream is=유알엘.openStream();
BufferedInputStream bis=new BufferedInputStream(is);
//유알엘에 있는 이미지를 얻어서 바이트 배열에 내보낸다
//데이터 목적지 : 바이트 배열 == ByteArrayOutputStream 이용
ByteArrayOutputStream baos=new ByteArrayOutputStream();
BufferedOutputStream bos=new BufferedOutputStream(baos);
byte ba[]=new byte[1024];
int n=0;
while((n=bis.read(ba))!=-1){
bos.write(ba, 0, n);
bos.flush();
}//while
final byte[] imgData=baos.toByteArray();
if(bos!=null){
bos.close();
}
if(bis!=null){
bis.close();
}
if(baos!=null){
baos.close();
}
if(is!=null){
is.close();
}
Bitmap bitmap=BitmapFactory.decodeByteArray(imgData, 0, imgData.length);//바이트배열 , 시작값, 길이
Drawable image=new BitmapDrawable(bitmap);
//이미지뷰를 생성해서 Drawable 객체와 연결한다
this.Imgicon=new ImageView(this);
Imgicon.setLayoutParams(new LinearLayout.LayoutParams(80, 80));
Imgicon.setScaleType(ImageView.ScaleType.CENTER);
Imgicon.setImageDrawable(image);
layout1.addView(Imgicon);
}//getimage
*/
//사용자 정의 메소드 - xml을 파싱한다
public void myparsing(int event, XmlPullParser parser) throws IOException, XmlPullParserException{
while(event!=parser.END_DOCUMENT){
switch(event){
case XmlPullParser.START_TAG:{
//시작 엘리먼트를 열거
String ename=parser.getName();
//Log.i("test", "ename : "+ename);
if(ename.equals("yweather:condition")){
//text라는 속성값 얻기
String text=parser.getAttributeValue(null, "text");
//Log.i("test", "text : "+text);
String temp=parser.getAttributeValue(null, "temp");
//Log.i("test", "temp : "+temp);
String date=parser.getAttributeValue(null, "date");
//Log.i("test", "date : "+date);
String code=parser.getAttributeValue(null, "code");
//Log.i("test", "imgSrc=http://l.yimg.com/a/i/us/we/52/"+code+".gif");
map.put("text", text);
map.put("temp", temp);
map.put("date", date);
map.put("code", code);
}//if
} break;
}//switch
event=parser.next();//이걸 안 하면 무한루프
}//while
}//myparsing
}
--------
대략적으로 이것이 무엇을 하는 내용이냐면, xml파서를 이용하여 http://weather.yahooapis.com/forecastrss?w=1132599&u=c 사이트에서 오늘의 기온을 가져오는 코드입니다.
일단은 브라우저로 http://weather.yahooapis.com/forecastrss?w=1132599&u=c에 들어가보시기 바랍니다.
이미 망해버린 야후이지만, 오늘의 날씨가 뜰 겁니다. 현재 기온에 대해서는 영어로 대충의 날씨, 기온, 그리고 위에는 그림이 있습니다. 그 아래로는 향후 5일간의 날씨가 텍스트로 보입니다.
그럼 다시, 이번에는 크롬으로 http://weather.yahooapis.com/forecastrss?w=1132599&u=c에 들어가보시기 바랍니다.
네. 자동으로 소스보기처럼 보입니다. 이 사이트의 내부구조가 훤히 보입니다. 이렇게 사이트를 만들면 보안문제라던가 발생할 것 같지만... 대신 직관적인 구조로 접근성은 대단히 높습니다. 그럼 지금부터 위 소스의 일부를 따와서 해설을 하도록 하겠습니다.
String str유알엘="http://weather.yahooapis.com/forecastrss?w=1132599&u=c";
유알엘 유알엘=new 유알엘(str유알엘);
> 해당 사이트에 접속을 합니다.
if(ename.equals("yweather:condition")){
String text=parser.getAttributeValue(null, "text");
String temp=parser.getAttributeValue(null, "temp");
String date=parser.getAttributeValue(null, "date");
String code=parser.getAttributeValue(null, "code");
map.put("text", text);
map.put("temp", temp);
map.put("date", date);
map.put("code", code);
}//if
> yweather:condition가 있는 부분에 접속하여(크롬페이지에서 yweather:conditionㄹ글 검색해보시기 바랍니다) 그 안에서 속성이 text, temp, date, code인 내용을 가져와 개인이 만든 레이아웃에 붙입니다.
내용이 더더욱 복잡하여 저도 전혀 모르는 내용이라 언급은 하지 않겠지만, 위 코드에는 이미지를 따오는 소스도 이미 포함되어 있습니다. 현재 문피아의 코드가 접근성을 고려하지 않은 것인지 보안에 너무 치중한 것인지 무슨 이유인지는 모르지만....... 기본적으로 위 사이트와 같은 구조로 되어 있다는 조건이 붙으면, 본문이 들어가 있는 태그값을 찾아 추적하고 본문이 포함된 속성만 따와서 map에 put하면 끝납니다.
'단순하게' 글보기 기능만을 포함하는 앱이나 모바일 페이지를 만든다고 하면... 위와 같은 언어로 기술되어 있다는 조건 하에 저도 이틀 내로 만들 겁니다. 현재 문피아 사이트 자체가 모바일 페이지와 앱으로의 접근성을 그다지 고려하지 않은 것과 같은 코드로 된 것 같아서 정확한 언급은 힘들지만... 아무튼 기본 사이트의 구조만 쉽다면 모바일 페이지나 앱은 그다지 어렵지 않은 기술로 만들 수 있습니다.
Comment ' 11