xml---sax操作

Posted Snowing杨雪莹

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了xml---sax操作相关的知识,希望对你有一定的参考价值。

<?xml version="1.0" encoding="UTF-8"?>
<书架>
    <>
        <书名>书名1</书名>
        <作者>作者1</作者>
        <售价>售价1</售价>
    </>
    <>
        <书名>书名2</书名>
        <作者>作者2</作者>
        <售价>售价2</售价>
    </>
</书架>

创建Book类来封装解析出来的xml

package day04;

public class Book {
    private String name;
    private String author;
    private String  price;
    public String getName() {
        return name;
    }
    public Book() {
    }
    public Book(String name, String author, String price) {
        this.name = name;
        this.author = author;
        this.price = price;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAuthor() {
        return author;
    }
    public void setAuthor(String author) {
        this.author = author;
    }
    public String getPrice() {
        return price;
    }
    public void setPrice(String price) {
        this.price = price;
    }

}

sax--解析过程

package day04;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;

public class Demo3 {
    
    
    //sax解析xml文档
    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException{
        Demo3 d=new Demo3();
        //1.创建解析工厂
        SAXParserFactory factory = SAXParserFactory.newInstance();
    
        
        //2.得到解析器
        SAXParser sp=factory.newSAXParser();
        
        
        //3.得到读取器
        XMLReader reader=sp.getXMLReader();
        
        
        //4.设置内容处理器
        BeanListHander Hander=d.new BeanListHander();
        reader.setContentHandler(Hander);
        
        
        //5.读取xml文档内容
        reader.parse("src/Book.xml");
        
        List<Book> list=Hander.getBooks();
        System.out.println(list );
        
    }
    //把xml文档中每一本书封装到一个book对象,并把多个对象放到一个list集合中返回 
    class BeanListHander extends DefaultHandler{
        private List<Book> list=new ArrayList<Book>();//存入list集合中
        private String currentTag;//记住当前解析到的是什么标签
        private Book book;
        @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes)
                throws SAXException {
            currentTag=qName;
            if("书".equals(currentTag)){
                 book=new Book();
            }
            
        }
        
        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
            if("书名".equals(currentTag)){
                String name = new String(ch,start,length);
                book.setName(name);
            }
            if("作者".equals(currentTag)){
                String  author= new String(ch,start,length);
                book.setAuthor(author);
            }
            if("售价".equals(currentTag)){
                String price = new String(ch,start,length);
                book.setPrice(price);
            }
        }

        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException {
            if(qName.equals("书")){
                list.add(book);
                book=null;
            }
            currentTag=null;
        }

        public List<Book> getBooks() {
            return list;
        }


        
    }

}

节点打到这一句:

List<Book> list=Hander.getBooks();

以上是关于xml---sax操作的主要内容,如果未能解决你的问题,请参考以下文章

从流输入中解析没有根元素的 XML 片段列表

xml---sax操作

SAX - DefaultHandler

org.xml.sax.SAXParseException:*VALID* XML 的文件过早结束

使用 SAX 读取 XML,跳过传递 org.xml.sax.SAXParseException 的节点

XML- SAX解析