안 드 로 이 드 의 세 가지 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;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Exception Class에서 에러 코드 해석 ~초기초편~직장에서 C# 프로젝트가 내뿜는 오류 코드를 구문 분석하고 오류의 위치를 확인하기 위해 Exception class를 활용할 수 있었습니다. 지금까지 Exception Class 에 대해서 별로 파악할 수 없었기 때...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.