SAX 방식 분석 xml 파일 날씨 보기
① 파서 플랜트 객체 작성
② 현재 구성된 플랜트 매개변수를 사용하여 SAXParser 객체 작성
③ xml 파일 분석
④DefaultHandler를 사용하여 이벤트 드라이버 만들기
2. 라벨 대상에 대한 인용은 어떻게 합니까?
① 현재 해석된 태그 정의: private String tagName=null;
② startElement() 메서드에 tagName:this.tagName=qName;
③ endElement () 메서드에서 tagName 값을 비워두기:this.tagName=null;
④ characters () 방법에서 tagName을 사용하여 탭의 내용을 가져옵니다
3. SAX 방식으로 xml 파일 관련 코드 분석
public List<City> saxXML() {
MyDefaultHandler myHandler=new MyDefaultHandler();
// :
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
try {
// : SAXParser
SAXParser saxparser = saxParserFactory.newSAXParser();
// : xml
saxparser.parse(
getClass().getClassLoader()
.getResourceAsStream("china.xml"),
myHandler);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return myHandler.getCities();
}
//
class MyDefaultHandler extends DefaultHandler {
//
private String tagName=null;
//
private City currentCity=null;
private List<City> cities;
public List<City> getCities() {
return cities;
}
@Override
public void startDocument() throws SAXException {
super.startDocument();
System.out.println("------------startDocument()-----------");
//
cities = new ArrayList<>();
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
System.out.println("-------------endDocument()----------");
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
// System.out.println("---startElement()------uri=" + uri
// + ";localName=" + localName + ";qName=" + qName
// + ";attributes=" + attributes);
if(qName.equals("city")){
//
currentCity=new City();
if(attributes!=null){
// xity
currentCity.setCityName(attributes.getValue("cityname"));
currentCity.setPyName(attributes.getValue("pyName"));
currentCity.setQuName(attributes.getValue("quName"));
currentCity.setState1(attributes.getValue("state1"));
currentCity.setState2(attributes.getValue("state2"));
currentCity.setStateDetailed(attributes.getValue("stateDetailed"));
currentCity.setTem1(attributes.getValue("tem1"));
currentCity.setTem2(attributes.getValue("tem2"));
currentCity.setWindState(attributes.getValue("windState"));
}
}
/*int length = attributes.getLength();
for(int i=0;i<length;i++){
String attrName = attributes.getQName(i);
String attrValue = attributes.getValue(attrName);
System.out.println(attrName+"----------"+attrValue);
}*/
this.tagName=qName;
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
super.endElement(uri, localName, qName);
// System.out.println("------endElement()------uri=" + uri
// + ";localName=" + localName + ";qName=" + qName);
if(qName.equals("city")){
cities.add(currentCity);
currentCity=null;
}
this.tagName=null;
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
super.characters(ch, start, length);
// System.out.println("----characters()------"+new String(ch,start,length));
if(tagName!=null){
String value=new String(ch,start,length);
if(tagName.equals("cityname")){
//System.out.println("----name------"+new String(ch,start,length));
currentCity.setCityName(value);
}else if(tagName.equals("pyName")){
currentCity.setPyName(value);
}else if(tagName.equals("quName")){
currentCity.setQuName(value);
}else if(tagName.equals("state1")){
currentCity.setState1(value);
}else if(tagName.equals("state2")){
currentCity.setState2(value);
}else if(tagName.equals("stateDetailed")){
currentCity.setStateDetailed(value);
}else if(tagName.equals("tem1")){
currentCity.setTem1(value);
}else if(tagName.equals("tem2")){
currentCity.setTem2(value);
}else if(tagName.equals("windState")){
currentCity.setWindState(value);
}
}
}
}
4. 날씨 인터페이스의 구축 방식은 spinner 플러그인을 사용하여 도시의 선택을 할 수 있다.
인터페이스를 구성하는 관련 코드:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="${packageName}.${activityClass}" >
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:text="@string/tq_wendu" />
<TextView
android:id="@+id/tv_wendu"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/textView2"
android:gravity="right"
android:text="@string/wendu_default" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/textView2"
android:text="@string/tq_fengli" />
<TextView
android:id="@+id/tv_fengli"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/sp_cities"
android:layout_alignParentRight="true"
android:gravity="right"
android:text="@string/fengli_txt" />
<Spinner
android:id="@+id/sp_cities"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_below="@+id/textView1"
android:entries="@array/cities" />
</RelativeLayout>
5. 디버깅
이벤트 등록 spcities.setOnItemSelectedListener(this);sp 가 아니라cities.setOnItemClickListener(this);이벤트
컨트롤 기본값을 설정하려면 sp 만 사용하십시오cities.setSelection(1);도시의 기본값을 가져오는 방법입니다.(물론 그중의'1'은 당신이 원하는 숫자로 바꿀 수 있습니다)
6. 날씨 관련 코드를 확인합니다.
package www.csden.net.activityh;
import java.util.List;
import www.csdn.domain.City;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity implements OnItemSelectedListener{
private Spinner sp_cities;
private String cities[];
private SaxXML saxXml;
private TextView tv_fengli,tv_wendu;
private List<City> entities;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//
sp_cities=(Spinner) findViewById(R.id.sp_cities);
//
sp_cities.setOnItemSelectedListener(this);
//int cityId = R.array.cities;
saxXml=new SaxXML();
//
cities=getResources().getStringArray(R.array.cities);
tv_fengli=(TextView) findViewById(R.id.tv_fengli);
tv_wendu=(TextView) findViewById(R.id.tv_wendu);
//
sp_cities.setSelection(1);
// xml
entities=saxXml.saxXML();
}
/**
* parent: The AdapterView where the selection happened
* view: The view within the AdapterView that was clicked
* position: The position of the view in the adapter
* id: The row id of the item that is selected
*/
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position,
long id) {
System.out.println(parent+"---"+view+"---"+position+"---"+id);
Toast.makeText(this, cities[position], Toast.LENGTH_LONG).show();
//
for(City c:entities){
// City
if(c.getQuName().equals(cities[position])){
//
tv_fengli.setText(c.getWindState());
//
tv_wendu.setText(c.getTem1()+"°~"+c.getTem2()+"°");
}
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
}
요약:
SAX 방식으로 xml 파일을 확인합니다.
문서를 읽을 때 일련의 이벤트를 활성화합니다. 이 이벤트는 이벤트 프로세서에 떠밀려 있고 이벤트 프로세서가 문서 내용에 대한 접근을 제공합니다.xml 파일을 메모리에 한 번에 불러올 필요가 없습니다. 이벤트 드라이브를 사용합니다.
SAX의 장점: 가장 큰 장점은 메모리 소모가 적다는 것이다. 왜냐하면 전체 문서가 한 번에 메모리에 불러올 필요가 없기 때문에 SAX해상기는 시스템 메모리보다 큰 문서를 해석할 수 있다.
SAX 단점: 다가오는 모든 이벤트를 처리할 수 있도록 여러 개의 이벤트 처리 프로그램을 실행해야 합니다. 또한 프로그램 코드에서 이 이벤트 상태를 유지해야 합니다. SAX 해석기가 메타 정보를 교류할 수 없기 때문에 문서 단계의 어느 위치에 있는지 추적해야 합니다.
XPath와 같은 탐색 지원이 내장되어 있지 않습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.