JAVA解析XML文件(二)---SAX方式解析

来源:互联网 发布:网络自媒体怎么赚钱 编辑:程序博客网 时间:2024/05/18 11:27

JAVA解析XML文件(二)—SAX方式解析

1.XML文件内容:

<?xml version="1.0"  encoding="UTF-8"?><bookstore>    <book id="1">        <name>冰与火之歌</name>        <author>乔治·马丁</author>        <year>2015</year>        <price>200</price>    </book>    <book id="2">        <name>光荣与梦想</name>        <year>2004</year>        <price>150</price>        <publish>科学出版社</publish>    </book></bookstore>

2.JAVA代码:

(1)新建一个类对Handler方法重写

 public class SAXParserHandler extends DefaultHandler {    int bookIndex = 0;    String value = null;    Book book = null;    private ArrayList<Book> bookList = new ArrayList<Book>();    public ArrayList<Book> getBookList() {        return bookList;    }    /**     * 用来标示解析开始     */    @Override    public void startDocument() throws SAXException {        // TODO Auto-generated method stub        super.startDocument();        System.out.println("解析开始");    }    /**     * 用来标示解析结束     */    @Override    public void endDocument() throws SAXException {        // TODO Auto-generated method stub        super.endDocument();        System.out.println("解析完成");    }    /**     * 用于遍历xml的开始标签     */    @Override    public void startElement(String uri, String localName, String qName,            Attributes attributes) throws SAXException {        // TODO Auto-generated method stub        super.startElement(uri, localName, qName, attributes);        if (qName.equals("book")) {            bookList.add(book);            book = null;            bookIndex++;            // 创建一个Book对象,用来接收解析到的元素和节点            book = new Book();            System.out.println("================开始遍历第" + bookIndex                    + "本书的内容=================");            // //已知book标签有有一个属性为id时,调用getValue方法即可            // String value = attributes.getValue("id");            // System.out.println("book标签的属性值为:"+ value);            // 不知道book标签的属性及个数时,可通过索引遍历,方法如下            int num = attributes.getLength();            System.out.println("book标签共有" + num + "个属性:");            for (int i = 0; i < num; i++) {                // 通过遍历索引来获取属性的名称和值                System.out.print("第" + (i + 1) + "个属性的名称是:"                        + attributes.getQName(i));                System.out.println("--->它的属性值是:" + attributes.getValue(i));                // 将获取的属性值赋给book对象中的id属性                if (attributes.getQName(i).equals("id")) {                    book.setId(attributes.getValue(i));                }            }        }        else if (!(qName.equals("book") || qName.equals("bookstore"))) {            // 获取节点名            System.out.print("节点名是:" + qName);            // 将获取到的节点属性值赋给相应的节点        }    }    /**     * 用于遍历xml的结束标签     */    @Override    public void endElement(String uri, String localName, String qName)            throws SAXException {        // TODO Auto-generated method stub        super.endElement(uri, localName, qName);        if (qName.equals("book")) {            book = null;            System.out.println("================结束遍历第" + bookIndex                    + "本书的内容=================");        } else if (qName.equals("")) {            System.out.println("出错了,写的什么屎玩意儿!!!");        } else if (qName.equals("name")) {            book.setName(value);        //  System.out.println("名称已写入"+book.getName());        } else if (qName.equals("author")) {            book.setAuthor(value);        } else if (qName.equals("year")) {            book.setYear(value);        } else if (qName.equals("price")) {            book.setPrice(value);        } else if (qName.equals("publish")) {            book.setPublish(value);        }    }    /**     * 用于获取节点的值     */    @Override    public void characters(char[] ch, int start, int length)            throws SAXException {        // TODO Auto-generated method stub        super.characters(ch, start, length);        // 获取节点值        value = new String(ch, start, length);        if (!value.trim().equals("")) {            System.out.println("--->它的值是:" + value);        }    }

(2)新建SAX解析方法进行解析

public ArrayList<Book> SAXParseXML() {        // 通过SAXParserFactory的newInstance方法创建一个实例        SAXParserFactory factory = SAXParserFactory.newInstance();        SAXParserHandler handler = null;        try {            // 通过factory的newSAXParser方法创建一个SAXParser实例            SAXParser parser = factory.newSAXParser();            // 创建一个SAXParserHandler对象,SAXParserHandler类继承自DefaultHandler,里边重载了一些方法            handler = new SAXParserHandler();            // 通过parser的parse方法解析目标xml文件            parser.parse("MyXML.xml", handler);            return handler.getBookList();        } catch (ParserConfigurationException e) {            e.printStackTrace();        } catch (SAXException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }        return handler.getBookList();    }

(3)main()方法调用

    public static void main(String[] args) {        SAXTest st = new SAXTest();        st.SAXParseXML();    }
0 0
原创粉丝点击