안 드 로 이 드 의 세 가지 xml 분석 방법 - sax 분석, pull 분석, dom

xml ?

xml ,

<?xml version="1.0" encoding="UTF-8"?>
<xml_api_reply version="1">
	<weather module_id="0" tab_id="0" mobile_row="0" mobile_zipped="1" row="0" section="0">
		<forecast_information>
			<city data="Jiaozuo, Henan"/>
			<postal_code data="jiaozuo"/>
			<latitude_e6 data=""/>
			<longitude_e6 data=""/>
			<forecast_date data="2011-08-07"/>
			<current_date_time data="2011-08-07 16:00:00 +0000"/>
			<unit_system data="SI"/>
		</forecast_information>
		<current_conditions>
			<condition data=" "/>
			<temp_f data="77"/>
			<temp_c data="25"/>
			<humidity data="  : 78%"/>
			<icon data="/ig/images/weather/cn_overcast.gif"/>
			<wind_condition data="  :   、  :4  / "/>
		</current_conditions>
		<forecast_conditions>
			<day_of_week data="  "/>
			<low data="21"/>
			<high data="29"/>
			<icon data="/ig/images/weather/chance_of_storm.gif"/>
			<condition data="      "/>
		</forecast_conditions>
		<forecast_conditions>
			<day_of_week data="  "/>
			<low data="22"/>
			<high data="33"/>
			<icon data="/ig/images/weather/chance_of_storm.gif"/>
			<condition data="      "/>
		</forecast_conditions>
		<forecast_conditions>
			<day_of_week data="  "/>
			<low data="21"/>
			<high data="34"/>
			<icon data="/ig/images/weather/sunny.gif"/>
			<condition data=" "/>
		</forecast_conditions>
		<forecast_conditions>
			<day_of_week data="  "/>
			<low data="21"/>
			<high data="33"/>
			<icon data="/ig/images/weather/chance_of_storm.gif"/>
			<condition data="      "/>
		</forecast_conditions>
	</weather>
</xml_api_reply>
어떻게 이 xml 파일 의 날씨 정 보 를
-----------------------------------------------------------
                     오늘 화요일
그림.            최저 온도 23 도 최고 온도 35 도
                     이 가능 하 다, ~ 할 수 있다,...
휴대 전화 인터페이스 에 '그림 과 글 이 모두 훌륭 하 다' 는 우호 적 인 형식 으로 나타 날 까?
사실 이 과정 은 데이터 의 형식 과 위 치 를 바 꾸 고 데이터 의 의 미 는 변 하지 않 는 다.
안 드 로 이 드 에서 데 이 터 는 자바 대상 으로 전달 되 므 로 먼저 xml 파일 을 자바 대상 으로 바 꿔 야 합 니 다 (예 를 들 어 파일 을 week, low, high, pic, message 속성 을 가 진 Weather 대상 으로 바 꿀 수 있 습 니 다). 그리고 자바 데 이 터 를 레이아웃 파일 에 제공 하여 최종 적 으로 우호 적 인 형식 으로 인터페이스 에 나타 날 수 있 습 니 다.
그 중에서 'xml 파일 을 자바 대상 으로 변환' 하 는 과정 은 xml 분석 입 니 다.
안 드 로 이 드 에는 세 가지 가 있 습 니 다. sax, pull, dom.그러나 자주 사용 되 는 것 은 앞의 두 가지 입 니 다.
대체적으로 분석 에는 세 개의 참여 자가 필요 합 니 다. xml 파일 (데이터 원본, 분석 할 대상), 대상 (분석 할 데이터 형식), 분석 처리 프로그램 이 필요 합 니 다.
우리 개발 자 들 이 여기 서 주로 해 야 할 일 은  [해석 의 구체 적 인 목표 와 선택 한 해석 방식 에 따라 해석 절 차 를 제어 할 수 있 는 코드 를 작성 합 니 다]
① SAX 해석
public class WeatherService {

	public List<Weather> getWeather(InputStream stream) throws Exception {
		
		WeatherHandler w = new WeatherHandler();
		
		SAXParserFactory factory = SAXParserFactory.newInstance();//   sax    
		SAXParser parser = factory.newSAXParser();//       sax   
		parser.parse(stream, w);//          
		
		
		return w.getWeatherList();
	}
	public List<Weather> getWeather(String xml) throws Exception {
		
		WeatherHandler w = new WeatherHandler();
		
		SAXParserFactory factory = SAXParserFactory.newInstance();
		SAXParser parser = factory.newSAXParser();
		
		parser.parse(new InputSource(new StringReader(xml)), w);
		
		return w.getWeatherList();
	}
	
	//   
	private class WeatherHandler extends DefaultHandler {
		
		private List<Weather> weatherList;
		private Weather weather;
		private String target;//               (                    )
		
		public List<Weather> getWeatherList() {
			return weatherList;
		}
		                                   
		
		@Override
		public void startDocument() throws SAXException {
			weatherList = new ArrayList<Weather>();//    new              List<Object>
		}
		
		
//uri         ,localName        , k:state k  uri,state  localName
/ / qName 은 전체 이름 을 표시 하고, attributes 는 속성 @ Override 를 표시 합 니 다.
		public void startElement(String uri, String localName, String qName,
				Attributes attributes) throws SAXException {
			if("forecast_conditions".equals(localName)) {
				weather = new Weather();
				target = "forecast_conditions";
			} else if("day_of_week".equals(localName) && "forecast_conditions".equals(target)) {
                             //                          
				weather.setDate(attributes.getValue("data") );
			} else if("low".equals(localName) && "forecast_conditions".equals(target)) {
		weather.setLow(attributes.getValue("data"));
			} else if("high".equals(localName) && "forecast_conditions".equals(target)) {
				weather.setHign(attributes.getValue("data"));
			} else if("icon".equals(localName) && "forecast_conditions".equals(target)) {
				weather.setWeatherPic(attributes.getValue("data"));
			} else if("condition".equals(localName) && "forecast_conditions".equals(target)) {
				weather.setMessage(attributes.getValue("data"));
			}
		}
		
		@Override
		public void endElement(String uri, String localName, String qName)
				throws SAXException {
			if("forecast_conditions".equals(localName)) {//         ,     ,              
				weatherList.add(weather);
				target = null;// target  null      ,                    
			}
		}
		
		@Override
		public void characters(char[] ch, int start, int length)
				throws SAXException {
			
		}
		
		@Override
		public void endDocument() throws SAXException {
			System.out.println("xml    ");
		}
		
	}
	
}

②Pull

public List<Weather> getWeatherWithPull(String xml) throws Exception {
		
		List<Weather> list = null;
		Weather w = null;
		
		XmlPullParser parser = Xml.newPullParser();
		parser.setInput(new StringReader(xml));//         
		
		int event = parser.getEventType();                                                                                                  // SAX    ,event        ,      ,   SAX  documentStart   
		
		while(event != XmlPullParser.END_DOCUMENT) {//      
			
			switch(event) {
				case XmlPullParser.START_DOCUMENT:
					list = new ArrayList<Weather>(); //              
					break;
				case XmlPullParser.START_TAG :
					String tagName = parser.getName();
					
					if("forecast_conditions".equals(tagName)) {  //tag
						w = new Weather();
					} else if("day_of_week".equals(tagName) && w != null) {
						w.setDate(parser.getAttributeValue(null,"data"));//null         
					} else if("low".equals(tagName) && w != null) {
						w.setLow(parser.getAttributeValue(null, "data"));
					} else if("high".equals(tagName) && w != null) {
						w.setHign(parser.getAttributeValue(null, "data"));
					} else if("icon".equals(tagName) && w != null) {
						w.setWeatherPic(parser.getAttributeValue(null, "data"));
					} else if("condition".equals(tagName) && w != null) {
						w.setMessage(parser.getAttributeValue(null, "data"));//
					}
					break;
				case XmlPullParser.END_TAG:
					String endTagName = parser.getName();
					if("forecast_conditions".equals(endTagName)) {
						list.add(w);
						w = null;
					}
					break;
			}
			event = parser.next();
		}
		return list;
	}
	
	
③ DOM 해석
public List<Weather> getWeatherWithDom(String xml) throws Exception {
		
		List<Weather> weatherList = null;
		
		DocumentBuilder dom = DocumentBuilderFactory.newInstance().newDocumentBuilder();
		
		Document doc = dom.parse(new InputSource(new StringReader(xml)));
		
		Element root = doc.getDocumentElement();
		
		NodeList list = root.getElementsByTagName("forecast_conditions");
		
		for(int i = 0;i<list.getLength();i++) {
			
			if(weatherList == null) {
				weatherList = new ArrayList<Weather>();
			}
			
			Weather w = new Weather();
			
			Node node = list.item(i);
			NodeList child= node.getChildNodes();
			
			for(int j = 0;j<child.getLength();j++) {
				Element childNode = (Element) child.item(j);
				//      
				String nodeName = childNode.getNodeName();
				if("day_of_week".equals(nodeName)) {
					w.setDate(childNode.getAttribute("data"));
				} else if("low".equals(nodeName)) {
					w.setLow(childNode.getAttribute("data"));
				} else if("high".equals(nodeName)) {
					w.setHign(childNode.getAttribute("data"));
				} else if("icon".equals(nodeName)) {
					w.setWeatherPic(childNode.getAttribute("data"));
				} else if("condition".equals(nodeName)) {
					w.setMessage(childNode.getAttribute("data"));
				}
				
			}
			
			weatherList.add(w);
			
		}
		
		return weatherList;
	}

좋은 웹페이지 즐겨찾기