zoukankan      html  css  js  c++  java
  • 【转】java使用sax解析xml文件

    从下面这个url搬运。http://hck.iteye.com/blog/1175762

    不过程序略有改动。

    关于sax(搬自百科)

    SAX,全称Simple API for XML,既是指一种接口,也是指一个软件包。

    SAX是事件驱动型 XML解析的一个标准接口不会改变      SAX的工作原理简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文档 (document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。

    大多数SAX都会产生以下类型的事件:
    1.在文档的开始和结束时触发文档处理事件。
    2.在文档内每一XML元素接受解析的前后触发元素事件。
    3.任何元数据通常由单独的事件处理
    4.在处理文档的DTD或Schema时产生DTD或Schema事件。
    5.产生错误事件用来通知主机应用程序解析错误。

    SAX的常用接口

    ContentHandler接口

    ContentHandler是Java类包中一个特殊的SAX接口,位于org.xml.sax包 中。该接口封装了一些对事件处理的方法,当XML解析器开始解析XML输入文档时,它会遇到某些特殊的事件,比如文档的开头和结束、元素开头和结束、以及 元素中的字符数据等事件。当遇到这些事件时,XML解析器会调用ContentHandler接口中相应的方法来响应该事件。

    ContentHandler接口的方法有以下几种:
    void startDocument()
    void endDocument()
    void startElement(String uri, String localName, String qName, Attributes atts)
    void endElement(String uri, String localName, String qName)
    void characters(char[ ] ch, int start, int length)
     
    DTDHandler接口,EntityResolver接口,ErrorHandler接口,这三个接口表示还没用过。
     

    SAX解析文档过程举例

    对于一个XML文档举例来说            
    <doc>
    <para>Hello,World!</para>
    </doc>
    其解析的过程为:
    1.start document
    2.start element:doc......
    3.start element:para.....
    4.characters:Hello,World!
    5.end element:para......
    6.end element;doc......
    7.end document
    对于解析过程中的每一步都会有事件发生,都会触发相应接口中的事件处理程序。
     
    说的差不多了,来看个程序。

    <?xml version="1.0" encoding="GB2312"?>  
        <books  count="3" xmlns="http://test.org/books">  
            <!--books's comment-->  
            <book id="1">  
                <name>Thinking in JAVA</name>  
                <price>11</price>
            </book>  
            <book id="2">  
                <name>Core JAVA2</name>  
                <price>22</price>
            </book>  
            <book id="3">  
                <name>C++ primer</name>  
                <price>33</price>
            </book>  
        </books>  
    // Book.java

    public
    class Book { private int id; private String name; private double price; 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 double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public String toString(){ return "id = "+id + ",name = " + name + ",price = "+price; } }
    // BooksDefaultHandler.java


    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 BooksDefaultHandler extends DefaultHandler{ private List<Book> booklist; private Book currentBook; private String tag; @Override public void startDocument() throws SAXException { booklist = new ArrayList<Book>(); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if("book".equals(localName)){ Integer id = new Integer(attributes.getValue(0)); currentBook = new Book(); currentBook.setId(id); } tag = localName; } @Override public void characters(char[] ch, int start, int length) throws SAXException { if(tag != null){ String data = new String(ch,start,length); if("name".equals(tag)){ currentBook.setName(data); }else if ("price".equals(tag)){ Double price = new Double(data); currentBook.setPrice(price); } } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if("book".equals(localName)){ booklist.add(currentBook); currentBook = null; } tag = null; } public List<Book> getBooklist() { return booklist; } }
    // SAXBook.java
    import
    java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.List; import org.xml.sax.ContentHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.XMLReaderFactory; public class SAXBook { public static void main(String[] args) throws FileNotFoundException, IOException, SAXException{ BooksDefaultHandler contentHandler = new BooksDefaultHandler(); XMLReader reader = XMLReaderFactory.createXMLReader(); reader.setContentHandler(contentHandler); reader.parse(new InputSource(new FileReader("d:/90.Temp/books.xml"))); List booklist = contentHandler.getBooklist(); for(Object book : booklist){ System.out.println((Book)book); } } }

    输出:

    id = 1,name = Thinking in JAVA,price = 11.0
    id = 2,name = Core JAVA2,price = 22.0
    id = 3,name = C++ primer,price = 33.0
  • 相关阅读:
    JSOI2015 总结
    JSOI2014 总结
    JSOI2010/2011 总结
    1.13 考试总结
    1.15 考试总结
    [SDOI2015]寻宝游戏
    [教程]视频网课如何打开倍速纵享丝滑
    对机器学习的一些理解【学术篇】
    angular JS 路由功能
    理解 $scope
  • 原文地址:https://www.cnblogs.com/cyttina/p/2999334.html
Copyright © 2011-2022 走看看