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

SAX解析xml

发布时间:2020-12-16 06:02:12 所属栏目:百科 来源:网络整理
导读:?xml version="1.0" encoding="UTF-8"?persons person id="23" name李明/name age30/age /person person id="20" name李向梅/name age25/age /person/persons person的类 public class Person { private Integer id; private String name;private Short age;
<?xml version="1.0" encoding="UTF-8"?>
<persons>
  <person id="23">
    <name>李明</name>
    <age>30</age>
  </person>
  <person id="20">
    <name>李向梅</name>
    <age>25</age>
  </person>
</persons>

person的类

public class Person {

    private Integer id;
    private String name;
private Short age;

    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public Short getAge() {
        return age;
    }

    public void setAge(Short age) {
        this.age = age;
    }
}

SAX解析XML文件

SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备。SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML语法中的某部分,如果符合就会触发事件。所谓事件,其实就是一些回调(callback)方法,这些方法(事件)定义在ContentHandler接口。

package com.xml;

import java.util.ArrayList;
import java.util.List;

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

public class XMLContentHandler extends DefaultHandler{
	private List<Person> persons = null;
    private Person currentPerson;
    private String tagName = null;//当前解析的元素标签

     public List<Person> getPersons() {
    	
                return persons;
    }

    //接收文档开始的通知。当遇到文档的开头的时候,调用这个方法,可以在其中做一些预处理的工作。
    @Override
    public void startDocument() throws SAXException {
                persons = new ArrayList<Person>();
    }

     //接收元素开始的通知。当读到一个开始标签的时候,会触发这个方法。其中namespaceURI表示元素的命名空间;
    //localName表示元素的本地名称(不带前缀);qName表示元素的限定名(带前缀);atts 表示元素的属性集合
    @Override
    public void startElement(String namespaceURI,String localName,String qName,Attributes atts) throws SAXException {
                 
                if(qName.equals("person")){
                            currentPerson = new Person();
                            currentPerson.setId(Integer.parseInt(atts.getValue("id")));
                }

                this.tagName = qName;
    }

    //接收字符数据的通知。该方法用来处理在XML文件中读到的内容,第一个参数用于存放文件的内容,
    //后面两个参数是读到的字符串在这个数组中的起始位置和长度,使用new String(ch,start,length)就可以获取内容。
    @Override
    public void characters(char[] ch,int start,int length) throws SAXException {

                if(tagName!=null){
                            String data = new String(ch,length);
                            if(tagName.equals("name")){
                                        this.currentPerson.setName(data);
                            }else if(tagName.equals("age")){
                                        this.currentPerson.setAge(Short.parseShort(data));
                            }
                }
    }

     //接收文档的结尾的通知。在遇到结束标签的时候,调用这个方法。其中,uri表示元素的命名空间;
    //localName表示元素的本地名称(不带前缀);name表示元素的限定名(带前缀)
    @Override
    public void endElement(String uri,String qname) throws SAXException {

                if(qname.equals("person")){
                            persons.add(currentPerson);
                            currentPerson = null;
                          
                }

                this.tagName = null;
    }
	
	
	
}
驱动的调用
package com.xml;

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


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


public class readXML {

	public static List<Person> read(InputStream inStream) {
	SAXParserFactory saxParserFactory=SAXParserFactory.newInstance();
	try {
		SAXParser saxParser=saxParserFactory.newSAXParser();
		// saxParser.setProperty("http://xml.org/sax/features/namespaces",true);
         XMLContentHandler handler = new XMLContentHandler();
         saxParser.parse(inStream,handler);
        
         inStream.close();

         return handler.getPersons();
	} catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	
	return null;
	
	}
}
从服务获取xml的输入流

package com.xml;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;

import com.HttpUtil;

public class HttpUtils {

	public static InputStream getXML(String path){
		InputStream inputStream=null;
		try{
			URL url=new URL(path);
			if(url!=null){
				HttpURLConnection connection=(HttpURLConnection) url.openConnection();
				connection.setConnectTimeout(3000);
				connection.setDoInput(true);
				connection.setRequestMethod("GET");
				int code=connection.getResponseCode();
				if(code==200){
					inputStream=connection.getInputStream();
					//String s=HttpUtil.changInputStream(inputStream,"utf-8");
					//System.out.println(s);
				}
			}
			
			
			
		}catch(Exception e){
			
		}
		return inputStream;
	}
	
	
	public static void main(String[] args) {
		String path="http://112.83.244.105/http/person.xml";
		InputStream inputStream=getXML(path);
		List<Person> persons=readXML.read(inputStream);
		for(Person p:persons){
			System.out.println(p.getName()+"---"+p.getAge());
		}
	}
}

(编辑:李大同)

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

    推荐文章
      热点阅读