android使用sax解析xml

新建一个类继承DefaultHandler

package com.sax.handler;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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

public class MyHandler2 extends DefaultHandler {
	private String currentTag=null;
	private String currentValue=null;
	private String nodeName=null;
	private HashMap<String, String> map=null;
	private List<HashMap<String, String>> list=null;

	public List<HashMap<String, String>> getList() {
		return list;
	}

	public MyHandler2(String nodeName) {
		// TODO Auto-generated constructor stub
		this.nodeName=nodeName;
	}
	
	@Override
	public void startDocument() throws SAXException {
		// TODO Auto-generated method stub
		list=new ArrayList<HashMap<String,String>>();
	}
	
	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		// TODO Auto-generated method stub
		if (qName!=null && !qName.equals("")&&qName.equals(nodeName)) {
			map=new HashMap<String, String>();
		}
		currentTag=qName;
	}
	
	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		// TODO Auto-generated method stub
		if (map!=null && currentTag!=null ) {
			currentValue=new String(ch, start, length);
			if (currentValue!=null && !currentValue.equals("")
					&&!currentValue.startsWith("\n")) {
				map.put(currentTag, currentValue);
			}
		}
		currentTag=null;
		currentValue=null;
	}
	
	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
		// TODO Auto-generated method stub
		if (qName!=null&&qName.equals(nodeName)) {
			list.add(map);
		}
	}

}

一个HttpUtils2类

package com.sax.http;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class HttpUtils2 {

	public HttpUtils2() {
		// TODO Auto-generated constructor stub
	}
	public InputStream getXML(String path){
		InputStream inputStream=null;
		URL url;
		try {
			url = new URL(path);
			HttpURLConnection httpUrlConnection=(HttpURLConnection) url.openConnection();
			httpUrlConnection.setConnectTimeout(3000);
			httpUrlConnection.setRequestMethod("GET");
			if (httpUrlConnection.getResponseCode()==200) {
				 inputStream=httpUrlConnection.getInputStream();
				
			}
			
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return inputStream;
	}

}


一个SaxService2类

package com.sax.service;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.SAXException;

import com.sax.handler.MyHandler2;
import com.sun.org.apache.xerces.internal.parsers.SAXParser;

public class SaxService2 {

	public SaxService2() {
		// TODO Auto-generated constructor stub
	}
	public List<HashMap<String, String>> parseXML(InputStream is,MyHandler2 dh){
		List<HashMap<String, String>> list=null;
		SAXParserFactory factory=SAXParserFactory.newInstance();
		try {
			javax.xml.parsers.SAXParser saxParser=factory.newSAXParser();
			saxParser.parse(is, dh);
			 list=dh.getList();
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return list;
	}

}


测试类
package com.sax.test;

import java.io.InputStream;
import java.util.HashMap;
import java.util.List;

import com.sax.handler.MyHandler2;
import com.sax.http.HttpUtils2;
import com.sax.service.SaxService2;

public class Test2 {

	public Test2() {
		// TODO Auto-generated constructor stub
	}
	public static void main(String[] args) {
		System.out.println("My test....");
		SaxService2 service=new SaxService2();
		MyHandler2 hd=new MyHandler2("person");
		HttpUtils2 util=new HttpUtils2();
		String path = "http://127.0.0.1:8080/person.xml";
		InputStream inputStream=util.getXML(path);
		List<HashMap<String, String>> list=service.parseXML(inputStream, hd);
		for (HashMap<String, String> hashMap : list) {
			System.out.println(hashMap.toString());
		}
	}
}


把如下xml文件放到tomcat中,就可以就行测试读取xml文件了

<?xml version="1.0" encoding="GBK"?>
<persons>
	<person>
		<id>23</id>
		<name>张三</name>
		<age>30</age>
	</person>
	<person>
		<id>20</id>
		<name>李四</name>
		<age>25</age>
	</person>
</persons>

使用SAX的优点是:
因为SAX的优势是流的方式处理,当遇到一个标签的时候,并不会记录下当前所碰到的标签。
也就是说,startEelment方法中,你所知道的信息,仅仅是当前的签名的名字和属性,至于标签的嵌套结构,上层标签的名字,是否有子元素与其他结构相关的信息,都是不知道的



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Studio 中,可以使用 SAX 解析解析 XML 文件。SAX 解析器是一种基于事件的解析器,它可以将 XML 文件解析为一系列事件,然后通过监听这些事件来获取所需的数据。 以下是使用 SAX 解析解析 XML 文件的示例代码: ```java public class MyHandler extends DefaultHandler { private String currentValue; private boolean parsingName; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if (localName.equals("name")) { parsingName = true; } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if (parsingName) { // 处理姓名数据 parsingName = false; } } @Override public void characters(char[] ch, int start, int length) throws SAXException { if (parsingName) { currentValue = new String(ch, start, length); } } } // 在 Activity 中使用 SAX 解析器 try { InputStream inputStream = getResources().openRawResource(R.raw.my_xml_file); SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); MyHandler handler = new MyHandler(); saxParser.parse(inputStream, handler); } catch (Exception e) { e.printStackTrace(); } ``` 在上面的示例代码中,MyHandler 类继承了 DefaultHandler 类,并重写了 startElement()、endElement() 和 characters() 方法来监听 XML 文件中的事件。在 startElement() 方法中,可以判断当前解析的标签是否是所需的标签,并进行相应的处理;在 endElement() 方法中,可以完成对标签数据的处理;在 characters() 方法中,可以获取标签文本内容。 在 Activity 中,可以使用 SAXParserFactory 类和 SAXParser 类来创建和使用 SAX 解析器。在调用 saxParser.parse() 方法时,需要传入要解析XML 文件的输入流和事件处理器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值