characters函数中应该是value =new string(ch,start,length);你看你是不是 写成了String value=new String(ch,start,length);
方便发下代码吗
第一段是XML代码
第二段是控制台输出的内容
第三段就是实现代码了
属性值是空的话,输出来的内容什么都没有哦
多了一个book的导入
你需要把代码贴出来看看,猜不出
而且每轮用完全局变量后,取null,可以减少内存消耗
把错误提示和代码贴出来
你的startElement()方法里没有创建book对象,应该在 bIndex++;之后 创建一个 book= new Book();应该就对了,试试看看
book=null已经清空
她在这节课中没讲,道理是一样的,取到year节点对象后继续获取year节点的子节点对象,取值
最开头的<bookstore>标签也会进入startDocument()方法,所以要排除掉;
另外,后面的结束标签</bookstore>才会进入endDocument()方法
startElement()方法中,只有在qName.equals("book")的时候,book才实例化( book = new Books() ).
虽然没怎么明白解析的过程 ,不过就老师的讲解而言,我觉得应该是在解析的内部是以多线程的方式解析,所以只需要重写要实现的功能的代码就行,其他的执行过程都是交给了多线程进行执行(个人意见,应该可以这么理解,具体实现多查一些相关书籍看看吧)
楼上的正解。startElement方法遇到节点就解析,你的代码相当于每次都在new Book();
至于为什么还是有2个book,是因为你在endElement方法的时候判断book标签了,而book结束标签只有2个,
所以你添加了2个null的book内容。
一般我们写东西,只需要知道是怎么用的就好,并不用研究怎么来的,而且有些的也研究不了。
我的也是
可以本地看
//获取所有VatBatch000000022016-07-27_10-55-22节点的集合
NodeList bookList = document.getElementsByTagName("book"); //把books改为book
//通过nodelist的getLength()方法可以获取bookList的长度
if(qName.equals("book")){
bookList.add(book);
book=null;
System.out.println("============结束遍历第"+bookIndex+"本书的内容==============");
}else if(qName.equals("name")){
book.setName(value );
}else if(qName.equals("author")){
book.setName(value );
}else if(qName.equals("year")){
book.setName(value );
}else if(qName.equals("price")){
book.setName(value );
}else if(qName.equals("language")){
book.setName(value );
}
name是setName,author是setAuthor,下面的也是,要对应
你试一下把super.startElement注释掉会看到 输出结果也没什么影响 还有子类重写方法不一定要调用父类方法 你看toString就知道了 只有子类调用构造方法会调用父类构造方法
对象添加list里面前不要book = null; 你看看是不是这错了
你应该把
SAXParserHandler
的源码发出来
希望能看到SAXParserHandler的完整代码。
我估计:
可能你定义了两个value变量,一个是全局变量,另一个是characters()方法内局部变量。全局变量为缺省值null,局部变量为文本内容(上面遍历结果表示局部变量value中有内容)。而set中传递的为全局变量。
所以建议检查:
全局变量中定义:String value;
charaters()方法中定义: value = new String(ch, start, length);
注意:characters()中value前没有 类型String 关键字
请说普通话
不是啊,它做了判断,当qName.equals("name")时,才执行boot.seiName(),value已经是对应书名了
因为handler的执行顺序是这样的,startElement 方法,然乎characters方法,在endElement方法,而判断在enElement处,也就是说,来到判断语句之前,value在characters方法已经获取了相应的值了。
value已经获取到值了,下面的判断,,肯定有值。
我记得昨晚回答了,怎么今天没有了。
首先你要明白,handler的执行顺序,先是开始节点,startElement,然后Characters,然后在结束,再Characters方法代码块里,已经将value值赋值了,就是那句value=new String(ch, start, length); 这一句就赋与了相对应的Element的值,也就是说qName等于name时,其实已经自动传入对应的start,length进去了,因为ch是数组嘛。
所以在endElement处进行判断如果qName.equals("name"),就 book.setName(value);为什么要判断呢,因为xml的换行空格算子节点,那么这些节点名字肯定不是name。
所以整体的一个机制:你可以理解成handler类似一种带处理功能的指针,遍历xml文件时,从开头读到结尾是一个一个节点开始。而里面相应的变量的值在变化,变化的顺序startElement,然后Characters,然后在endElement。
你看一下你的xml中的</name>写错了