加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

SAX 解析 XML

发布时间:2020-12-16 09:31:58 所属栏目:百科 来源:网络整理
导读:SAX是一种以事件为驱动的 XML API,其定义的事件流可以指定从解析器传到专门的处理程序代码的XML结构。 【优点】:解析速度快、占用内存少。特别适用于Android等移动设备。 使用步骤: ①:针对从XML中获取到的信息,需对其建立一个对象(例:Person),存放相
SAX是一种以事件为驱动的 XML API,其定义的事件流可以指定从解析器传到专门的处理程序代码的XML结构。
【优点】:解析速度快、占用内存少。特别适用于Android等移动设备。
使用步骤:
①:针对从XML中获取到的信息,需对其建立一个对象(例:Person),存放相关信息
②:新建一个类继承至DefaultHandler(DefaultHandler是已经实现了ContentHandler的接口),提供了相应的方法。
复写以下方法处理:startDocument();
startElement(String uri,String localName,String qName,Attributes attributes);
characters(char[] ch,int start,int length);
endElement(String uri,String qName);
endDocument();
[方法中参数解释]示例:<newii:will>
uri: 命名空间,示例中的newii
localName: 标签名称,示例中的will
qName: 带命名空间的标签名,示例中的newii:will
attributes: 存放该标签的所有属性


ch: 当前读取到的TextNode字节数组
start: 字节开始位置
length: 当前TextNode长度
③:测试需要,建立一个person.xml文件,内容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<persons>
<person id="23">
<name>Test</name>
<age>21</age>
</person>
</persons>
④:在应用中通过
InputStream is = MainActivity.class.getClassLoader().getResourceAsStream("person.xml");
加载需要解析的文件,并通过一个SAXParserFactory来创建具体的SAXParser
解析XML有两种形式,需要创建一个XMLReader或直接使用SAXParser
使用XMLReader方式:
XMLReader xmlReader = saxParser.getXMLReader();
xmlReader.setContentHandler(handler);
xmlReader.parse(new InputSource(is));
使用SAXParser方式:
saxParser.parse(is,handler);


【附】:android应用单元测试方法
①:在AndroidManifest.xml中添加节点
<uses-library android:name="android.test.runner" />
<instrumentation android:name="android.test.InstrumentationTestRunner"
android:targetPackage="cn.gzu.xmlparsertest" />
②:建立测试类继承AndroidTestCase


【源代码如下:】
*/
/****************************************【源码】START**************************************************/

//1.Person.java

public class Person {
	private Integer id;
	private String name;
	private short age;
	
	public Person() {
		super();
	}
	public Person(String name,short age) {
		super();
		this.name = name;
		this.age = age;
	}
	public Person(Integer id,String name,short age) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
	}
	// getter and setter ...
}


//2.SAXForHandler.java
public class SAXForHandler extends DefaultHandler {
	private static final String TAG = "SAXForHandler";
	private List<Person> persons;
	// 记录前一个标签的名称
	private String preTag;
	// 记录当前Person对象
	Person person;
	public List<Person> getPersons() {
		return persons;
	}

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

	@Override
	public void startElement(String uri,Attributes attributes) throws SAXException {
		if("person".equals(localName)){
			for(int i=0;i<attributes.getLength();i++){
				Log.i(TAG," attributeName :"+attributes.getLocalName(i)+
						" attributeValue :"+attributes.getValue(i));
				person = new Person();
				person.setId(Integer.parseInt(attributes.getValue(i)));
			}
		}
		preTag = localName;
		Log.i(TAG,"***** startElement execute *****"+qName);
	}

	@Override
	public void characters(char[] ch,int length)
			throws SAXException {
		String data = new String(ch,start,length).trim();
		if(!"".equals(data.trim())){
			Log.i(TAG," content :"+data.trim());
			if("name".equals(preTag)){
				person.setName(data);
			}else if("age".equals(preTag)){
				person.setAge(new Short(data));
			}
		}
		
	}
	
	@Override
	public void endElement(String uri,String qName)
			throws SAXException {
		Log.i(TAG,"***** endElement execute *****"+qName);
		if("person".equals(localName)){
			persons.add(person);
			person = null;
		}
		preTag = null;
	}

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



//3.SAXParserUtil.java
public class SAXParserUtil {
	public static List<Person> saxXml (InputStream is) throws Exception{
		SAXForHandler saxForHandler = new SAXForHandler();
		SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
		
		SAXParser saxParser = saxParserFactory.newSAXParser();
		saxParser.parse(is,saxForHandler);
		List<Person> persons = saxForHandler.getPersons();
		is.close();
		return persons;
	}
}




//4.单元测试类 SAXParserTest.java
public class SAXParserTest extends AndroidTestCase {
	private static final String TAG = "SAXParserTest";
	
	public void testSAXGetPerson() throws Throwable{
		InputStream is = this.getClass().getClassLoader().getResourceAsStream("person.xml");
		List<Person> persons = SAXParserUtil.saxXml(is);
		String text = "";
		for(Person p:persons){
			text = text + "ID: "+p.getId()+" Name: "+p.getName()+" Age: "+p.getAge()+"n";
		}
		Log.i(TAG,text);
	}
}




//5.MainActivity.java
public class MainActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		TextView main = (TextView) findViewById(R.id.main_content);
		
		InputStream is = MainActivity.class.getClassLoader().getResourceAsStream("person.xml");
		try {
			List<Person> persons = SAXParserUtil.saxXml(is);
			String text = "";
			for(Person p:persons){
				text = text + "ID: "+p.getId()+" Name: "+p.getName()+" Age: "+p.getAge()+"n";
			}
			main.setText(text);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
}

//6.AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="cn.gzu.xmlparsertest"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <uses-library android:name="android.test.runner" />
        
        <activity
            android:name="cn.gzu.xmlparsertest.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    
    <instrumentation android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="cn.gzu.xmlparsertest" />

</manifest>
/****************************************【源码】END**************************************************/

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读