SAX 방식 분석 xml 파일 날씨 보기

9577 단어
1. 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와 같은 탐색 지원이 내장되어 있지 않습니다.
 
 

좋은 웹페이지 즐겨찾기