为了账号安全,请及时绑定邮箱和手机立即绑定

SAX解析

public class SAXParserHandler extends DefaultHandler {
    int bIndex = 0;
    private ArrayList<Book> bookList = new ArrayList<Book>();
    Book book=null;
    String qValue = null;

    public ArrayList<Book> getBookList() {
        return bookList;
    }

    @Override
    public void startDocument() throws SAXException {
        super.startDocument();
        System.out.println("开始解析XML文件");
    }

    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
        System.out.println();

        System.out.println("一共有"+bookList.size()+"本书");
        for (int i=0;i<bookList.size();i++){
            System.out.println("一共有"+(i+1)+"本书");
            Book b = bookList.get(i);
            System.out.println("书名:"+b.getName());
            System.out.println("作者:"+b.getAuthod());
            System.out.println("年份:"+b.getYear());
            System.out.println("价格:"+b.getPrice());
            System.out.println("语言:"+b.getLanguage());
        }
        System.out.println("结束解析XML文件");
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        super.startElement(uri, localName, qName, attributes);

        if(qName.equals("book")){
            bIndex++;
            System.out.println("开始遍历第"+bIndex+"本书");
//            //已知属性的情况
//            String value = attributes.getValue("id");
//            System.out.println("book的id属性值为:"+value);
            //不知道属性的值
            for (int i=0;i<attributes.getLength();i++){
                System.out.println("第"+(i+1)+"个属性名为:"+attributes.getQName(i));
                System.out.println("第"+(i+1)+"个属性值为:"+attributes.getValue(i));
            }
            System.out.println("结束遍历第"+bIndex+"本书");
        }else if(!qName.equals("bookstore")&&!qName.equals("name")){
            System.out.print("节点名为:"+qName+"---");
        }

    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        super.endElement(uri, localName, qName);
        if (qName.equals("book")){
            bookList.add(book);
            book =null;
            System.out.println("开始保存第"+bIndex+"本书的内容。。。。。。");
        }
        else if (qName.equals("id")){
            book.setId(qValue);
        }
        else if (qName.equals("name")) {
            book.setName(qValue);
        }
        else if (qName.equals("authod")){
            book.setAuthod(qValue);
        }
        else if (qName.equals("year")){
            book.setYear(qValue);
        }
        else if (qName.equals("price")){
            book.setPrice(qValue);
        }else if(qName.equals("language")){
            book.setLanguage(qValue);
        }
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        super.characters(ch, start, length);
        qValue = new String(ch,start,length);
        if(!qValue.trim().equals("")){
            System.out.println("节点值为:"+qValue);
        }
    }
}
public class SAXTest {

    public static void main(String[] args) throws Exception {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser parser = factory.newSAXParser();
        SAXParserHandler handler = new SAXParserHandler();
        parser.parse("books.xml",handler);
    }
}
public class Book {
    private String id;
    private String name;
    private String authod;
    private String price;
    private String year;
    private String language;

    public Book(){}

    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 getAuthod() {
        return authod;
    }

    public void setAuthod(String authod) {
        this.authod = authod;
    }

    public String getPrice() {
        return price;
    }

    public void setPrice(String price) {
        this.price = price;
    }

    public String getYear() {
        return year;
    }

    public void setYear(String year) {
        this.year = year;
    }

    public String getLanguage() {
        return language;
    }

    public void setLanguage(String language) {
        this.language = language;
    }
}

求助,为什么SAXPaserHandler中的endElement中会报空指令异常?

正在回答

1 回答

你的startElement()方法里没有创建book对象,应该在 bIndex++;之后 创建一个 book= new Book();应该就对了,试试看看

0 回复 有任何疑惑可以回复我~
#1

moummm 提问者

非常感谢!
2017-08-12 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
Java眼中的XML---文件读取
  • 参与学习       83203    人
  • 解答问题       431    个

通过Java认识并且创造XML文件,如何应用 Java“解析 XML

进入课程
意见反馈 帮助中心 APP下载
官方微信