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

    解析步骤:

    1、通过SAXParserFactory的静态newInstance()方法获取SAXParserFactory实例factory

    SAXParserFactory factory = SAXParserFactory.newInstance();

    2、通过SAXParserFactory实例的newSAXParser()方法返回SAXParser实例parser

     SAXParser parser = factory.newSAXParser();

    3、创建一个类继承DefaultHandler,重写其中的一些方法进行业务处理并创建这个类的实例handler

     SAXParserHandler handler = new SAXParserHandler();

    生成xml步骤:

    1、创建一个TransformerFactory类的对象

    SAXTransformerFactory tff = (SAXTransfromerFactory)SAXTransformerFactory.newInstance();

    2、通过SAXTransformerFactory对象创建一个TransformerHandler对象

    TransformerHandler handler = tff.newTransformerHandler();

    3、通过handler对象创建一个Transformer对象

    Transformer tr = handler.getTransformer();

    4、通过Transformer对象生成的xml文件进行设置

    //设置xml的编码
    tr.setOutputProperty(OutputKeys.ENCODING,"UTF-8");
    //设置xml是否换行
    tr.setOutputProperty(OutputKeys.INDENT,"yes");

    5、创建一个Result对象,并且使其与handler关联

    File file = new File("book1.xml");
    if(!file.exists()){
        file.createNewFile();
    }
    Result result = new StreamResult(new FileOutputStream(file));
    handler.setResult(result);

    6、利用handler对象进行xml文件内容的编写

    需要解析的xml文件book.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <bookstore>
        <book id="1">
            <name>冰与火之歌</name>
            <author>乔治马丁</author>
            <year>2014</year>
            <price>89</price>
        </book>
        <book id="2">
            <name>安徒生童话</name>
            <year>2004</year>
            <price>77</price>
            <language>English</language>
        </book>    
    </bookstore>

    book.java

    package com.imooc.entity;
    
    public class Book {
        private String id;
        private String name;
        private String author;
        private String year;
        private String price;
        private String language;
        public String getId() {
            return id;
        }
        public void setId(String 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;
        }
        public String getYear() {
            return year;
        }
        public void setYear(String year) {
            this.year = year;
        }
        public String getPrice() {
            return price;
        }
        public void setPrice(String price) {
            this.price = price;
        }
        public String getLanguage() {
            return language;
        }
        public void setLanguage(String language) {
            this.language = language;
        }
        
        
    }

    SAXParserHandler.java

    package com.imooc.handler;
    
    import java.util.ArrayList;
    
    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
    
    import com.imooc.entity.Book;
    
    
    public class SAXParserHandler extends DefaultHandler {
        String value = null;
        Book book = null;
        private ArrayList<Book> bookList = new ArrayList<Book>();
        public ArrayList<Book> getBookList() {
            return bookList;
        }
    
        int bookIndex = 0;
        /**
         * 用来标识解析开始
         */
        @Override
        public void startDocument() throws SAXException {
            // TODO Auto-generated method stub
            super.startDocument();
            System.out.println("SAX解析开始");
        }
        
        /**
         * 用来标识解析结束
         */
        @Override
        public void endDocument() throws SAXException {
            // TODO Auto-generated method stub
            super.endDocument();
            System.out.println("SAX解析结束");
        }
        
        /**
         * 解析xml元素
         */
        @Override
        public void startElement(String uri, String localName, String qName,
                Attributes attributes) throws SAXException {
            //调用DefaultHandler类的startElement方法
            super.startElement(uri, localName, qName, attributes);
            if (qName.equals("book")) {
                bookIndex++;
                //创建一个book对象
                book = new Book();
                //开始解析book元素的属性
                System.out.println("======================开始遍历某一本书的内容=================");
    //            //已知book元素下属性的名称,根据属性名称获取属性值
    //            String value = attributes.getValue("id");
    //            System.out.println("book的属性值是:" + value);
                //不知道book元素下属性的名称以及个数,如何获取属性名以及属性值
                int num = attributes.getLength();
                for(int i = 0; i < num; i++){
                    System.out.print("book元素的第" + (i + 1) +  "个属性名是:"
                            + attributes.getQName(i));
                    System.out.println("---属性值是:" + attributes.getValue(i));
                    if (attributes.getQName(i).equals("id")) {
                        book.setId(attributes.getValue(i));
                    }
                }
            }
            else if (!qName.equals("name") && !qName.equals("bookstore")) {
                System.out.print("节点名是:" + qName + "---");
            }
        }
        
        @Override
        public void endElement(String uri, String localName, String qName)
                throws SAXException {
            //调用DefaultHandler类的endElement方法
            super.endElement(uri, localName, qName);
            //判断是否针对一本书已经遍历结束
            if (qName.equals("book")) {
                bookList.add(book);
                book = null;
                System.out.println("======================结束遍历某一本书的内容=================");
            }
            else if (qName.equals("name")) {
                book.setName(value);
            }
            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("language")) {
                book.setLanguage(value);
            }
        }
        
        
        @Override
        public void characters(char[] ch, int start, int length)
                throws SAXException {
            super.characters(ch, start, length);
            value = new String(ch, start, length);
            if (!value.trim().equals("")) {
                System.out.println("节点值是:" + value);
            }
        }
    }

    SAXText.java

    package com.imooc.test;
    
    import java.io.IOException;
    
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
    
    import org.xml.sax.SAXException;
    import org.xml.sax.SAXParseException;
    
    import com.imooc.entity.Book;
    import com.imooc.handler.SAXParserHandler;
    
    public class SAXTest {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            //获取一个SAXParserFactory实例
            SAXParserFactory factory = SAXParserFactory.newInstance();
            //通过factory获取SAXParser实例
            try {
                SAXParser parser = factory.newSAXParser();
                //创建SAXParserHandler对象
                SAXParserHandler handler = new SAXParserHandler();
                parser.parse("books.xml", handler);
                System.out.println("~!~!~!共有" + handler.getBookList().size()
                        + "本书");
                for (Book book : handler.getBookList()) {
                    System.out.println(book.getId());
                    System.out.println(book.getName());
                    System.out.println(book.getAuthor());
                    System.out.println(book.getYear());
                    System.out.println(book.getPrice());
                    System.out.println(book.getLanguage());
                    System.out.println("----finish----");
                }
            } catch (ParserConfigurationException e) {
                e.printStackTrace();
            } catch (SAXException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    }
  • 相关阅读:
    django变量使用-在模板中使用视图函数中的变量
    django创建app、在视图函数及url中使用参数、url命名、通过redirect实现网页路径跳转
    第一个django项目-通过命令行和pycharm两种方式
    python安装虚拟环境virtualenvwrapper
    装饰器案例由来例子
    转发:python 装饰器--这篇文章讲的通俗易懂
    JVM调优之jstack找出最耗cpu的线程并定位代码
    mysql视图定义、原理、创建、使用
    列表生成 加1四种方法
    【good】在CentOS 6.x上安装GlusterFS
  • 原文地址:https://www.cnblogs.com/linjian/p/4653172.html
Copyright © 2011-2022 走看看