個人学習ノートのSAX解析XMLファイル

9416 ワード

今日の夜にXMLの解析を勉強しました.XMLの解析方法はSAXとDOM解析とPull解析があります.今日はSAXを勉強しました.毎日8時に退勤します.仕事から帰ってきたら自分で料理を作るので、毎日1時ぐらいまで頑張って、朝8時に起きて料理を作って会社に持って行きます.これは全部変えます.ファイトリング.ははは、無駄話は多くないです.プロジェクトを見ましょう.
SAXでxml文書を解析するには、Androidシステムが提供するContentHandlerクラスを継承するクラスが必要です.ただし、Contenthandlerというクラスを継承すると、このような提供したすべての方法を使用しなくても、その内部のあらゆる方法を実現しなければなりません(一般的には使われていない方法は直接に空の方法で代替できます).したがって、Default Handlerという種類を継承することができます.このようにすれば、私達はプログラムに必要な方法を実現するだけでいいです.他の方法はこの種類の内部は実はすでに空いた方法で代替されました.
ContentHandler          :
void startDocument();//         
void endDocument();//         
void startElement(String uri, String localName, String qName, Attributes atts);//         
void endElement(String uri, String localName, String qName, Attributes atts);//         
void characters(char[] ch, int start, int length );//         
AndroidでSAXを使用してxmlファイルを解析するには、SAX工場、すなわちSAXarserFactoryオブジェクトを確立する必要があります.また、ContentHandlerサブクラスを結合し、xmlソースファイルと結合するXMLReaderオブジェクトを作成します.つまり、その処理過程は、イベント処理プログラムを作成し、SAX解析器を作成し、キーイベント処理プログラムを解析器に割り当て、文書を解析して、各イベントを処理プログラムに送信します.
1.srcディレクトリの下にAndroid.xmlファイルを新規作成します.
<?xml version="1.0" encoding="UTF-8"?>
<persons>
    <person id="23">
        <name>xiaanming</name>
        <age>23</age>
    </person>
    <person id="20">
        <name>liudehua</name>
        <age>28</age>
    </person>
</persons>
2.解析の対象を保存するためにPerson.classを新たに作成します.
package com.example.xml_parser;

public class Person {
	private int id;
	private String name;
	private int age;
	
	public Person(){}
	
	public Person(int id, String name, int age){
		this.id = id;
		this.name = name;
		this.age = age;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
	
	@Override
	public String toString() {
		return "id = " + id + ", name " + name + ", age = " + age;
	}
	
}
3.SAXforHandler類を新たに作ってDefault Handlerを継承します.Default HandlerはContentHandlerインターフェースを実現しました.必要な方法を書き直す必要があります.
package com.example.xml_parser;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;

import android.util.Log;

public class SAXforHandler extends DefaultHandler {
	private static final String TAG = "SAXforHandler";
	/**
	 *        Person  
	 */
	private List<Person> persons;
	
	/**
	 * Person      ,     Person
	 */
	private Person person;
	
	/**
	 *      ,           
	 */
	private String tag ;
	

	/**
	 *                    ,              
	 *  new    ArrayList<Person>()     Log
	 */
	@Override
	public void startDocument() throws SAXException {
		persons = new ArrayList<Person>();
		Log.i(TAG, "****startDocument*****");
	}

	/**
	 *              
	 */
	@Override
	public void endDocument() throws SAXException {
		Log.i(TAG, "****endDocument*****");
	}

	/**
	 * uri      
	 * localName      , name, age  
	 * qName          
	 * Attributes           
	 * 
	 *  localName person   ,      person      ,          ,     person.setId(Integer.valueOf(attributes.getValue(0)));
	 *     tag = person,        ,         characters(char[] ch, int start, int length),         
	 */
	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		if("person".equals(localName)){
			for(int i=0; i<attributes.getLength(); i++){
				Log.i(TAG, "attributesName: " + attributes.getLocalName(i) + "__attributesValue: " + attributes.getValue(i) );
				person = new Person();
				person.setId(Integer.valueOf(attributes.getValue(i)));
			}
		}
		
		tag = localName;
		Log.i(TAG, "localName = " + localName);
	}

	
	/**
	 *                   ,     trim()     ,        XML           
	 *               endElement(String uri, String localName, String qName),          
	 */
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		String date = new String(ch, start, length).trim();
		if(!"".equals(date)){
			Log.i(TAG, "Content: " + date);
		}
		if("name".equals(tag)){
			person.setName(date);
		}else if("age".equals(tag)){
			person.setAge(Integer.valueOf(date));
		}
	}
	
	
	/**
	 * uri ,localName, qName        
	 *  localName = person   person    null  ,    person      
	 *  person   List  
	 *            tag = null
	 */
	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		if("person".equals(localName) && person != null){
			persons.add(person);
			person = null;
		}
		
		tag = null;
	}
	
	/**
	 *       List<Person> persons   
	 * @return
	 */
	public List<Person> getPersons() {
		return persons;
	}


	/**
	 * 1.         ,  XML  src   ,                 ,             
	 * 2.  XML     ,    XMLReader       XMLParser
	 * @return
	 * @throws Exception
	 */
	public static List<Person> sax_XML() throws Exception{
		InputStream is = MainActivity.class.getClassLoader().getResourceAsStream("android.xml");
		
		/**      ,    getInputStreamContent (InputStream is)     ,     ,      ???*/
		
		SAXforHandler saXforHandler = new SAXforHandler();
		SAXParserFactory spf = SAXParserFactory.newInstance();
		SAXParser saxParser = spf.newSAXParser();
		
		//  XMLReader   
//		XMLReader xmlReader = saxParser.getXMLReader();
//		xmlReader.setContentHandler(saXforHandler);
//		xmlReader.parse(new InputSource(is));
		
		//    XMLParser,      
		saxParser.parse(is, saXforHandler);
		
		//       List  
		List<Person> list = saXforHandler.getPersons();
		is.close();
		return list;
	}
	
	
	/**
	 *     ,            
	 * @param is
	 * @return
	 * @throws IOException
	 */
	public static String getInputStreamContent (InputStream is) throws IOException{
		StringBuffer sb = new StringBuffer();
		BufferedReader br = new BufferedReader(new InputStreamReader(is));
		String line;
		while((line = br.readLine()) != null){
			sb.append(line);
		}
		br.close();
		
		Log.i(TAG, sb.toString());
		
		return sb.toString();
	}
}
その方法を呼び出すだけでエラーが発生しました.
org.apache.harmony.xml.ExpatParser$ParseException: At line 1, column 0: no element found
at org.apache.harmony.xml.ExpatParser.finish(ExpatParser.java:550)
at org.apache.harmony.xml.ExpatParser.parseDocument(ExpatParser.java:480)
at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:318)
at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:275)
at javax.xml.parsers.SAXParser.parse(SAXParser.java:390)
at javax.xml.parsers.SAXParser.parse(SAXParser.java:187)
at com.example.xml_parser.SAXforHandler.sax_XML(SAXforHandler.java:146)
at com.example.xml_parser.TestForXML.testSax_XML(TestForXML.java:7)
at java.lang.reflect.Method.invokeNative(Native Method)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:529)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1448)

その大牛はどういう状況か知っていますが、私はInputStreamを変えていません.なぜ異常が現れたのですか?大牛に教えてもらいます.
DOM解析XML
Pull解析XML