`

sax方式解析xml文件(asset文件和网络文件)

阅读更多
现在写了些博客后,变懒了!!!
1.在anddev.org上参考的一个例子: SaxParseXml.java文件
package cn.com;

import java.io.InputStream;
import java.net.URL;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class SaxParseXml extends Activity {

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle icicle) {
		super.onCreate(icicle);

		/* Create a new TextView to display the parsingresult later. */
		TextView tv = new TextView(this);
		try {
			/* Create a URL we want to load some xml-data from. */
			//URL url = new URL(
					//"http://www.anddev.org/images/tut/basic/parsingxml/example.xml");
			InputStream is = getAssets().open("dom.xml");
			/* Get a SAXParser from the SAXPArserFactory. */
			SAXParserFactory spf = SAXParserFactory.newInstance();
			SAXParser sp = spf.newSAXParser();

			/* Get the XMLReader of the SAXParser we created. */
			XMLReader xr = sp.getXMLReader();

			/* Create a new ContentHandler and apply it to the XML-Reader */
			ExampleHandler myExampleHandler = new ExampleHandler();

			xr.setContentHandler(myExampleHandler);

			/* Parse the xml-data from our URL. */
			//xr.parse(new InputSource(url.openStream()));
			xr.parse(new InputSource(is));
			   
			/* Parsing has finished. */

			/* Our ExampleHandler now provides the parsed data to us. */
			ParsedExampleDataSet parsedExampleDataSet = myExampleHandler
					.getParsedData();

			/* Set the result to be displayed in our GUI. */
			tv.setText(parsedExampleDataSet.toString());

		} catch (Exception e) {
			/* Display any Error to the GUI. */
			tv.setText("Error: " + e.getMessage());
		}
		/* Display the TextView. */
		this.setContentView(tv);
	}
}


2. ExampleHandler.java主要承担xml的解析工作
package cn.com;

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

public class ExampleHandler extends DefaultHandler {

	// ===========================================================
	// Fields
	// ===========================================================

	private boolean in_outertag = false;
	private boolean in_innertag = false;
	private boolean in_mytag = false;

	private ParsedExampleDataSet myParsedExampleDataSet = new ParsedExampleDataSet();

	// ===========================================================
	// Getter & Setter
	// ===========================================================

	public ParsedExampleDataSet getParsedData() {
		return this.myParsedExampleDataSet;
	}

	// ===========================================================
	// Methods Receive notification of the beginning of the document
	// ===========================================================
	@Override
	public void startDocument() throws SAXException {
		this.myParsedExampleDataSet = new ParsedExampleDataSet();
	}

	@Override
	public void endDocument() throws SAXException {
		// Nothing to do
	}

	// Gets be called on opening tags like: <tag> Can provide attribute(s), when
	// xml was like: <tag attribute="attributeValue">
	//
	@Override
	public void startElement(String namespaceURI, String localName,
			String qName, Attributes atts) throws SAXException {
		if (localName.equals("outertag")) {
			this.in_outertag = true;
		} else if (localName.equals("innertag")) {
			this.in_innertag = true;
		} else if (localName.equals("mytag")) {
			this.in_mytag = true;
		} else if (localName.equals("tagwithnumber")) {
			// Extract an Attribute
			String attrValue = atts.getValue("thenumber");
			int i = Integer.parseInt(attrValue);
			myParsedExampleDataSet.setExtractedInt(i);
		}
	}

	/**
	 * Gets be called on closing tags like: </tag>
	 */
	@Override
	public void endElement(String namespaceURI, String localName, String qName)
			throws SAXException {
		if (localName.equals("outertag")) {
			this.in_outertag = false;
		} else if (localName.equals("innertag")) {
			this.in_innertag = false;
		} else if (localName.equals("mytag")) {
			this.in_mytag = false;
		} else if (localName.equals("tagwithnumber")) {
			// Nothing to do here
		}
	}

	// Gets be called on the following structure: <tag>characters</tag>

	@Override
	public void characters(char ch[], int start, int length) {
		if (this.in_mytag) {
			//myParsedExampleDataSet.setFirstTag(new String(ch, start, length));
		}

		if (this.in_mytag) {
			myParsedExampleDataSet.setExtractedString(new String(ch, start,
					length));
		}
	}
}


3. ParsedExampleDataSet.java将解析出的内容复制到比如一个对象属性上
package cn.com;

public class ParsedExampleDataSet {
	private String extractedString = null;
	private int extractedInt = 0;

	public String getExtractedString() {
		return extractedString;
	}

	public void setExtractedString(String extractedString) {
		this.extractedString = extractedString;
	}
	
	//public void setFirstTag(String ){
		
	//}

	public int getExtractedInt() {
		return extractedInt;
	}

	public void setExtractedInt(int extractedInt) {
		this.extractedInt = extractedInt;
	}

	public String toString() {
		return "ExtractedString = " + this.extractedString + "nExtractedInt = "
				+ this.extractedInt;
	}
}



4.测试的xml文件

<?xml version="1.0" encoding="utf-8"?>
<outertag>
	<innertag sampleattribute="innertagAttribute">
		<mytag>anddev.org    gfgf</mytag>
		<tagwithnumber thenumber="1220"/>
	</innertag>
</outertag>
分享到:
评论

相关推荐

    xml数据存储

    6. **DOM和SAX解析器**:对于较大的XML文件,Android提供了两种解析机制。DOM(Document Object Model)将整个XML文档加载到内存中,便于遍历和操作。而SAX(Simple API for XML)是事件驱动的,逐行解析XML,占用...

    基于Android XmlPullParserjar 包

    对于 Android,通常是从 Asset 目录或者网络读取 XML 文件。 ```java parser.setInput(getInputStream(), "UTF-8"); ``` 3. **解析过程**:解析器的事件循环开始,每次调用 `parser.next()` 将返回当前事件类型...

    android笔试题及答案.pdf

    9. SAX解析XML文件:SAX解析器是一种基于事件驱动的解析方式,它不需要将整个XML文档加载到内存,从而节省资源,适用于处理大型XML文件。而DOM解析器会将整个XML文档加载到内存,便于进行各种操作,但消耗较大内存。...

    2022年最新Android高级技术笔试面试试题及答案.docx

    * Android中解析XML文件可以使用SAX、DOM、PULL等方法,其中DOM方法将整个文档加载到内存中进行解析。 三、权限管理相关知识点 * Android中需要使用摄像头硬件的权限是 android.permission.CAMERA。 四、Camera...

    Android考试题库[定义].pdf

    而`SAX`和`PULL`是基于事件的解析方式,它们不会一次性加载整个文件,相对节省资源。`JSON`则与XML解析无关。 3. 调用Android设备的摄像头硬件需要在`AndroidManifest.xml`文件中添加`...

    AssetCheckContentHandle

    3. **文件解析**:如果AssetCheckContentHandle处理的是结构化数据(如XML或JSON),它可能包含了解析和验证这些文件内容的方法。这可能涉及到DOM、SAX或Jackson库等解析技术。 4. **异常处理**:考虑到可能出现的...

    获取AndroidManifest里的信息

    - **SAX解析**:适用于大文件,按事件驱动的方式解析,内存占用低,但代码复杂度相对较高。 - **Pull解析**:Android提供的`XmlPullParser`接口,类似于SAX,但更易于使用,适合Android平台。 3. **获取特定信息*...

    必看Android 500道高薪面试题集

    23. XML解析的三种方式:DOM、SAX和Pull解析,以及它们各自优缺点。DOM需要将整个XML文档加载到内存,SAX是基于事件驱动的流式解析,Pull解析是SAX的迭代器形式。 24. Android缓存机制:包括内存缓存(如LruCache)...

    Android模拟测验库.docx编程资料

    - **知识点概述**:Android中有几种不同的方法可以用来解析XML文件,其中包括SAX、PULL、DOM等。 - **详细解释**: - **SAX**(Simple API for XML):一种基于事件驱动的解析器,适用于大文件的解析,因为它不...

    Android 核心面试题

    - XML解析方式包括DOM、SAX、Pull等,官方推荐使用Pull解析器。 29. 百度地图核心类和功能: - 百度地图SDK提供的核心类,如BDLocation、BMapManager等,可以实现地图展示、定位、路径规划等功能。 30. GC内存...

    Android典型技术模块开发详解

    10.1.4 从asset中读取文件 10.2 SharedPreferences(键值数据存储) 10.3 SQLite语法 10.4 SQLite数据操作 10.4.1 SQLLiteOpenHelper类 10.4.2 数据库表的增删改查 10.4.3 分页查询 10.5 SQLite事务支持 10.6 ...

Global site tag (gtag.js) - Google Analytics