• JavaEE XML SAX解析


    SAX解析XML

    @author ixenos

    SAX解析工具


     

    SAX解析工具-  Sun公司提供的。内置在jdk中。org.xml.sax.*

     

    核心的API:

    SAXParser类: 用于读取和解析xml文件对象

    parse(File f, DefaultHandler dh)方法: 解析xml文件

     

    参数一: File:表示 读取的xml文件。

    参数二: DefaultHandler: SAX事件处理程序。使用DefaultHandler的子类

    例如:{

    1.创建SAXParser对象

    SAXParser parser=SAXParserFactory.newInstance().newSAXParser();

    2.调用parse方法

    parser.parse(new File("./src/contact.xml"), new MyDefaultHandler());

    }              [一个类继承class 类名(extends DefaultHandler)  在调用是创建传进去

     

    DefaultHandler类的API:

    void startDocument()  :  在读到文档开始时调用

    void endDocument()  :在读到文档结束时调用

    主要重写以下三个方法

    void startElement(String uri, String localName, String qName, Attributes attributes)  :读到开始标签时调用

    void endElement(String uri, String localName, String qName)   :读到结束标签时调用

    void characters(char[] ch, int start, int length)  : 读到文本内容时调用,ch是所有Text内容的字符数组,用strat和length确定有意义的字符(非换行符)

    SAX解析常用API


    1、

    SAXParserFactory factory = SAXParserFactory.newInstance();

    Parser.parse(“books.xml”, handler);

    2、

    //handler参数是DefaultHandler对象

    DefaultHandler handler = new SAXParserHandler();

    3、

    //DefaultHandler最重要的几个回调方法

    startDocumentendDocument分别在文档开始和结束时各调用一次

    startElementendElement每当遇到起始或终止标签时调用

    characters在每当遇到标签中间的字符数据时调用(非换行符的Text)

    4、

    //DefaultHandler实现类

    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
    /**
     * SAX处理程序(如何解析xml文档)
     * @author APPle
     *
     */
    public class MyDefaultHandler extends DefaultHandler {
    
    	/**
    	 * 开始文档时调用
    	 */
    	@Override
    	public void startDocument() throws SAXException {
    		System.out.println("MyDefaultHandler.startDocument()");
    	}
    
    	/**
    	 * 开始标签时调用
    	 * @param qName: 表示开始标签的标签名
    	 * @param attributes: 表示开始标签内包含的属性列表
    	 */
    	@Override
    	public void startElement(String uri, String localName, String qName,
    			Attributes attributes) throws SAXException {
    		System.out.println("MyDefaultHandler.startElement()-->"+qName);
    	}
    
    	/**
    	 * 结束标签时调用
    	 * @param qName: 结束标签的标签名称
    	 */
    	@Override
    	public void endElement(String uri, String localName, String qName)
    			throws SAXException {
    		System.out.println("MyDefaultHandler.endElement()-->"+qName);
    	}
    
    	/**
    	 * 读到文本内容的时调用
    	 * @param ch: 表示当前读完的所有文本内容
    	 * @param start: 表示当前文本内容的开始位置
    	 * @param length: 表示当前文本内容的长度
    	 * char[](                                       张三              20)   100
    	 *                              98 2
    	 */
    	@Override
    	public void characters(char[] ch, int start, int length)
    			throws SAXException {
    		//得到当前文本内容
    		String content = new String(ch,start,length);
    		System.out.println("MyDefaultHandler.characters()-->"+content);
    	}
    
    	/**
    	 * 结束文档时调用
    	 */
    	@Override
    	public void endDocument() throws SAXException {
    		System.out.println("MyDefaultHandler.endDocument()");
    	}
    
    }
    

      

    示例二:

    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
    /**
     * SAX处理器程序
     * @author ixenos
     */
    public class MyDefaultHandler2 extends DefaultHandler {
    	//存储xml文档信息
    	private StringBuffer sb = new StringBuffer();
    	
    	//获取xml信息
    	public String getContent(){
    		return sb.toString();
    	}
    	
    
    	/**
    	 * 开始标签
    	 */
    	@Override
    	public void startElement(String uri, String localName, String qName,
    			Attributes attributes) throws SAXException {
    		sb.append("<"+qName);
    		//判断是否有属性
    		if(attributes!=null){
    			for(int i=0;i<attributes.getLength();i++){
    				//得到属性名称
    				String attrName = attributes.getQName(i);
    				//得到属性值
    				String attrValue = attributes.getValue(i);
    				sb.append(" "+attrName+"=""+attrValue+""");
    			}
    		}
    		sb.append(">");
    	}
    	
    	/**
    	 * 文本内容
    	 */
    	@Override
    	public void characters(char[] ch, int start, int length)
    			throws SAXException {
    		//得到当前读取的文本
    		String content = new String(ch,start,length);
    		sb.append(content);
    	}
    	
    	/**
    	 * 结束标签
    	 */
    	@Override
    	public void endElement(String uri, String localName, String qName)
    			throws SAXException {
    		sb.append("</"+qName+">");
    	}
    }
    

      

    示例三:

    package gz.itcast.c_sax;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
    /**
     * SAX处理程序
     * @author APPle
     *
     */
    public class MyDefaultHandler3 extends DefaultHandler {
    	//存储所有联系人对象
    	private List<Contact> list = new ArrayList<Contact>();
    
    	public List<Contact> getList(){
    		return list;
    	}
    	//保存一个联系人信息
    	private Contact contact;
    	/**
    	 * 思路:
    	 * 	1)创建Contact对象
    	 *  2)把每个contact标签内容存入到Contact对象
    	 *  3)把Contact对象放入List中
    	 */
    	//用于临时存储当前读到的标签名
    	private String curTag;
    
    	@Override
    	public void startElement(String uri, String localName, String qName,
    			Attributes attributes) throws SAXException {
    		curTag = qName;
    		//读取到contact的开始标签创建Contact对象
    		if("contact".equals(qName)){
    			contact = new Contact();
    
    			//设置id值
    			contact.setId(attributes.getValue("id"));
    		}
    	}
    
    	@Override
    	public void characters(char[] ch, int start, int length)
    			throws SAXException {
    		//当前文本内容
    		String content = new String(ch,start,length);
    
    		if("name".equals(curTag)){
    			contact.setName(content);
    		}
    
    		if("age".equals(curTag)){
    			contact.setAge(content);
    		}
    
    		if("phone".equals(curTag)){
    			contact.setPhone(content);
    		}
    
    		if("email".equals(curTag)){
    			contact.setEmail(content);
    		}
    
    		if("qq".equals(curTag)){
    			contact.setQq(content);
    		}
    	}
    
    	@Override
    	public void endElement(String uri, String localName, String qName)
    			throws SAXException {
    		//设置空时为了避免空格换行设置到对象的属性中
    		curTag = null;
    		//读到contact的结束标签放入List中
    		if("contact".equals(qName)){
    			list.add(contact);
    		}
    	}
    }
    

      

    5、基于事件

    SAXParserFactory factory = SAXParserFactory.newInstance();
    SAXParser parser = factory.newSAXParser();
    SAXParserHandler handler = new SAXParserHandler();

    parser.parse("books.xml", handler);

  • 相关阅读:
    三数之和
    167
    二分搜索树
    687
    索引堆
    二分查找 leetcode704
    leetcode 56合并区间 java
    leetcode 1046
    堆的数据结构java
    leetcode 493
  • 原文地址:https://www.cnblogs.com/ixenos/p/6280162.html
Copyright © 2020-2023  润新知