zoukankan      html  css  js  c++  java
  • SAX解析XML

    介绍

    Java解析XML有两种基本的方式,DOMSAX。今天先简单记录下SAX解析XML。

    SAX(Simple API for XML),既是一种接口,也是一种软件包。它是一种XML解析的替代方法。SAX不同于DOM解析,它逐行扫描文档,一边扫描一边解析。

    示例

    book.xml

    <?xml version="1.0" encoding="UTF-8"?>  
    <books>  
        <book id="1">  
            <name>平凡的世界</name>  
            <author>路遥</author>  
        </book>  
        <book id="2">  
            <name>活着</name>  
            <author>余华</author>  
        </book>  
    </books>
    

    Book.java

    public class Book{
    	private int id;
    	private String name;
    	private String author;
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getAuthor() {
            return author;
        }
    
        public void setAuthor(String author) {
            this.author = author;
        }
    }
    

    SaxParseXmlHandler.java

    public class SaxParseXmlHandler extends DefaultHandler{
    	private List<Book> books;
    	private Book book;
    	private String nodeName;
    
    	//开始解析文档
    	@Override
    	public void startDocument() throws SAXException {
        	books = new ArrayList<>();
    	}
    
    	//解析开始节点
    	@Override
    	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
    		if("book".equals(qName)){
    			book=new Book();
    			//获取book节点的id属性
    			book.setId(Integer.parseInt(attributes.getValue(0)));
    		}
    		nodeName=qName;
    	}
    
    	//获取节点内容
    	@Override
    	public void characters(char[] ch, int start, int length) throws SAXException {
    		if(null!=nodeName){
    			String content=new String(ch,start,length);
    			switch(nodeName){
    				case "name":
    					book.setName(content);
    					break;
    				case "author":
    					book.setAuthor(content);
    					break;
    			}
    		}
    	}
    
    	//解析结束节点
    	@Override
    	public void endElement(String uri, String localName, String qName) throws SAXException {
    		if("book".equals(qName)){
    			books.add(book);
    			book=null;
    		}
    		nodeName=null;
    	}
    
    	//结束解析文档
    	@Override
    	public void endDocument() throws SAXException {
        	super.endDocument();
    	}
    
    	//返回解析结果
    	public List<Book> getBooks(){
    		return boooks;
    	}
    	
    }
    

    Test.java

    public class Test{
    	public static void main(String[] args) {
    		try {
                //创建SAX解析器工厂
                SAXParserFactory factory = SAXParserFactory.newInstance();
                //创建SAX解析器
                SAXParser saxParser = factory.newSAXParser();
                //获取XML读取器
                XMLReader reader = saxParser.getXMLReader();
                //实例化SaxParseXmlHandler
                SaxParseXmlHandler handler = new SaxParseXmlHandler();
    			//设置内容处理器
                reader.setContentHandler(handler);
                //读取XML
                reader.parse("book.xml");
    
                List<Book> books = handler.getBooks();
                for (Book book : books) {
                    System.out.println("id:" + book.getId() + ",name:" + book.getName() + ",author:" + book.getAuthor());
                }
            } catch (ParserConfigurationException e) {
                e.printStackTrace();
            } catch (SAXException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
    	}
    }
    

    打印结果

    这里写图片描述

    注意事项

    读取XML文件时,如果XML文件和当前类不在同一个路径,可采用写完整路径的方式读取。如:

    InputStream is = Test.class.getClassLoader().getResourceAsStream("com/ywb/context/config/book.xml");
    reader.parse(new InputSource(is));
    
  • 相关阅读:
    HDU Number Sequence
    HDU Wolf and Rabbit
    HDU Fire Net
    C# QQ weather
    Jquery 随窗口改变大小不会影响浏览位置,DIV可以在绝对的位置不变.菜单相对位置不变
    C# 验证中国电话号码,电子邮件,网址,身份证号码等等
    C# Image Download
    Csharp 两个DataTable或DataView互换,可以用来加密解密
    C# Windows Forms TreeView SelectedNode(VS2008)
    C# 获取源代码
  • 原文地址:https://www.cnblogs.com/yinwenbing/p/6376241.html
Copyright © 2011-2022 走看看