为什么我的输出不对,我觉得算法和老师的一样,而且在主函数调用时,容器的长度返回值为0
package com.imooc.sax;
import java.util.ArrayList;
import javax.xml.stream.events.StartElement;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class Dh extends DefaultHandler{
private int q=0;
Books book=null;
String value=null;
private ArrayList<Books> booklist=new ArrayList<Books>();
//标识解析xml开始
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
System.out.println("解析开始...");
}
public ArrayList<Books> getBooklist() {
return booklist;
}
public void setBooklist(ArrayList<Books> booklist) {
this.booklist = booklist;
}
//标识解析结束
@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 {
//用SAXException类的 startElement方法遍历属性
super.startElement(uri, localName, qName, attributes);
book=new Books();
//在已知属性名情况下遍历属性
if(qName.equals("book")){
q++;
// String att=attributes.getValue("id");
// System.out.println("属性值 :"+att);
}else if(!qName.equals("book")&&!qName.equals("bookstore")){
System.out.print(" 节点名是 : "+qName+" :");
//不能直接调出节点值
// System.out.println(" 该节点值是 : "+attributes.getValue(q));
// 返回值 为 该节点值是 : null
}
//在未知属性名的情况下遍历属性
int x=attributes.getLength();
for(int i=0;i<x;i++){
System.out.println("第"+(i+1)+"个属性名: "+attributes.getQName(i));
System.out.println("第"+(i+1)+"个属性值: "+attributes.getValue(i));
}
}
//遍历xml结束标签
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
//用SAXException类的 startElement方法遍历属性
super.endElement(uri, localName, qName);
if(qName.equals("book")){
System.out.println("----------结束遍历第"+q+"本书---------------");
}
//将赋值进books
else if(qName.equals("id")){
book.setId(value);
System.out.println("Books的属性 :"+book.getId());
}
else if(qName.equals("name")){
book.setName(value);
System.out.println("book属性 :"+book.getName());
}else if(qName.equals("year")){
book.setYear(value);
System.out.println("book属性 :"+book.getYear());
}
else if(qName.equals("author")){
book.setYear(value);
System.out.println("book属性 :"+book.getAuthor());
}else if(qName.equals("price")){
book.setYear(value);
System.out.println("book属性 :"+book.getPrice());
}else if(qName.equals("langguge")){
book.setYear(value);
System.out.println("book属性 :"+book.getLangguge());
}
booklist.add(book);
int y;
System.out.println("容器长度 :"+(y=booklist.size()));
if(y==11){
for(int k=0;k<y;k++){
System.out.println("容器 :"+booklist.get(k).toString());
}
}
value=null;
}
// 调用characters方法输出节点值
@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);
}
}
}
------------------
输出
booklist容器长度 : 0
解析开始...
第1个属性名: id
第1个属性值: 1
节点名是 : name :冰与火之歌
book属性 :冰与火之歌
容器长度 :1
节点名是 : author :乔治马丁
book属性 :null
容器长度 :2
节点名是 : year :2014
book属性 :2014
容器长度 :3
节点名是 : price :89
book属性 :null
容器长度 :4
----------结束遍历第1本书---------------
容器长度 :5
第1个属性名: id
第1个属性值: 2
节点名是 : name :安徒生童话
book属性 :安徒生童话
容器长度 :6
节点名是 : year :2004
book属性 :2004
容器长度 :7
节点名是 : price :77
book属性 :null
容器长度 :8
节点名是 : language :English
容器长度 :9
----------结束遍历第2本书---------------
容器长度 :10
容器长度 :11
容器 :com.imooc.sax.Books@46f5f779
容器 :com.imooc.sax.Books@1c2c22f3
容器 :com.imooc.sax.Books@18e8568
容器 :com.imooc.sax.Books@33e5ccce
容器 :com.imooc.sax.Books@33e5ccce
容器 :com.imooc.sax.Books@5a42bbf4
容器 :com.imooc.sax.Books@270421f5
容器 :com.imooc.sax.Books@52d455b8
容器 :com.imooc.sax.Books@4f4a7090
容器 :com.imooc.sax.Books@4f4a7090
容器 :com.imooc.sax.Books@4f4a7090
解析结束!