zoukankan      html  css  js  c++  java
  • Sax解析Xml文档

    SAX(simpleAPIforXML)是一种XML解析的替代方法。相比于DOM,SAX是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。

    在用Sax解析xml文档的时候不要忽略节点之间的空白字符串。

    下面来实例看看如何使用Sax解析下面的Xml:

    <?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
    <persons>
    	<person id="1">
    		<name>范冰冰</name>
    		<age>31</age>
    	</person>
    	<person id="2">
    		<name>林志玲</name>
    		<age>38</age>
    	</person>
    	<person id="3">
    		<name>杨幂</name>
    		<age>26</age>
    	</person>
    </persons>


    1.首先写一个java类,继承DefaultHandler类

    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 SaxXML extends DefaultHandler {
    
    	private Person person;
    	private List<Person> list;
    	
    	private String currentTag;		//用来保存当前节点名
    	
    	public List<Person> getPersonList(){
    		return list;
    	}
    	
    	 //文档开始调用  只调用一次
    	@Override
    	public void startDocument() throws SAXException {
    		list=new ArrayList<Person>();
    	}
    	
    	//开始一个节点调用
    	@Override
    	public void startElement(String uri, String localName, String qName,
    			Attributes attributes) throws SAXException {
    		if(qName.equals("person")){
    			person=new Person();
    			person.setId(Integer.parseInt(attributes.getValue(0)));
    		}
    		currentTag=qName;
    	}
    
    	//读取到文本时调用
    	@Override
    	public void characters(char[] ch, int start, int length)
    			throws SAXException {
    		if(currentTag!=null){									//先判断当前节点不为空才开始操作
    			String content=new String(ch,start,length);
    			if(currentTag.equals("name")){
    				person.setName(content);
    			}else if(currentTag.equals("age")){
    				person.setAge(Integer.parseInt(content));
    			}
    		}
    	
    	}
    	//结束一个节点时调用
    	@Override
    	public void endElement(String uri, String localName, String qName)
    			throws SAXException {
    			if(qName.equals("person")){
    				list.add(person);
    				person=null;
    			}
    			currentTag=null;								//一个节点结束必须置空,否则将读取到节点后面的空字符串
    	}
    	  //结束文档时调用,只调用一次
        @Override
        public void endDocument() throws SAXException {
        }
    }

    2.然后写一个test方法,解析xml文件,输出结果

    package cn.itcast.xml;
    
    import java.io.InputStream;
    import java.util.List;
    
    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
    
    import android.test.AndroidTestCase;
    
    public class PersonTest extends AndroidTestCase {
    
    	public void SaxXMLTest() throws Exception {
    		// 构建SAXParser
    		SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
    		// 实例化 DefaultHandler对象
    		SaxXML handler = new SaxXML();
    		// 读取xml文件
    		InputStream in = PersonTest.class.getClassLoader().getResourceAsStream("persons.xml");
    		 //调用parse()方法,解析xml文档
            parser.parse(in, handler);
            //返回list
            List<Person> persons = handler.getPersonList();
            //打印结果
            for (Person p : persons)
    			System.out.println(p);
    
    	}
    
    }
    


    输出结果如下:




  • 相关阅读:
    H.264 RTP PAYLOAD 格式
    ARM:移动GPU往PC GPU效能迈进
    汪墩一中复校设想
    jconsole 和jvisualVM 监控远程 spring boot程序
    jenkins 登录远程机器并执行脚本,脚本中有后台执行的程序无法执行解决方法。
    linux下的抓包工具tcpdump
    adb logcat查看某个进程的输出日志
    Flask-SQLAlchemy 中多表链接查询(不使用外键)
    使用cnpm 安装vue.js
    Jmeter在非GUI环境下传递参数(命令行&Jenkins配置)
  • 原文地址:https://www.cnblogs.com/fzll/p/3954618.html
Copyright © 2011-2022 走看看