亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

為什么我輸出的value都是null呢,跟老師一樣的代碼

輸出:

SAX解析開始

=========開始遍歷第1本書的內容=========

book元素的第1個屬性名是:id---屬性值是:1

節點名是:name-----節點值是:冰與火之歌

節點名是:author-----節點值是:喬治馬丁

節點名是:year-----節點值是:2014

節點名是:price-----節點值是:89

===========結束遍歷第1本書的內容===============

=========開始遍歷第2本書的內容=========

book元素的第1個屬性名是:id---屬性值是:2

節點名是:name-----節點值是:安徒生童話

節點名是:year-----節點值是:2004

節點名是:price-----節點值是:77

節點名是:language-----節點值是:English

===========結束遍歷第2本書的內容===============

SAX解析結束

?。。」灿?本書!

null

null

null

null

89

null

------finish-------

null

null

null

null

null

English

------finish-------


SAXTest類:

package com.immoc.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 com.imooc.entity.Book;

import com.imooc.handler.SAXPAarserHandler;


public class SAXTest {


public static void main(String[] args) {

//獲取一個SAXparserFactory的實例

SAXParserFactory factory=SAXParserFactory.newInstance();

//通過factory獲取SAXparser實例

try {

SAXParser parser=factory.newSAXParser();

//創建SAXParserHandler對象

SAXPAarserHandler handler=new SAXPAarserHandler();

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) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (SAXException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}


}


}

以下是SAXParseHandler類代碼:

package com.imooc.handler;


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;


import com.imooc.entity.Book;


public class SAXPAarserHandler extends DefaultHandler {

int bookIndex=0;

String value=null;

//創建一個book對象

Book book=null;

private ArrayList<Book> bookList=new ArrayList<Book>();

// /**

// *?

// * 用來遍歷xml文件的開始標簽

// */

// @Override

// public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {

// // TODO Auto-generated method stub

// super.startElement(uri, localName, qName, attributes);

// }

//

// /**

// *?

// * 用來遍歷xml文件的結束標簽

// */

// @Override

// public void endElement(String uri, String localName, String qName) throws SAXException {

// // TODO Auto-generated method stub

// super.endElement(uri, localName, qName);

// }

public ArrayList<Book> getBookList() {

return bookList;

}

/**

*?

* 用來標識解析開始

*/

@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 {

// TODO Auto-generated method stub

//調用DefaultHandler類的startElemnet方法

super.startElement(uri, localName, qName, attributes);

//開始解析book元素的屬性

//創建一個book對象

book=new Book();

if(qName.equals("book")){

bookIndex++;


//開始解析book元素的屬性

System.out.println("=========開始遍歷第"+bookIndex+"本書的內容=========");

// //已知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));

//把bookid寫入對象

if(attributes.getQName(i).equals("id")){

book.setId(attributes.getValue(i));

}

}

}else if(!qName.equals("book") && !qName.equals("bookstore")){

System.out.print("節點名是:"+qName+"-----");

}

}

@Override

public void endElement(String uri, String localName, String qName) throws SAXException {

//調用DefaultHandler類的endElemnet方法

super.endElement(uri, localName, qName);

//判斷是否針對一本書已經遍歷結束

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.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 {

// TODO Auto-generated method stub

super.characters(ch, start, length);

value=new String(ch, start, length);

if(!value.trim().equals("")){

System.out.println("節點值是:"+value);

}

}

}

請問到底哪里錯了啊,

正在回答

4 回答

http://img1.sycdn.imooc.com//5a780eeb0001e22508430212.jpg

樓上的正解。startElement方法遇到節點就解析,你的代碼相當于每次都在new Book();

至于為什么還是有2個book,是因為你在endElement方法的時候判斷book標簽了,而book結束標簽只有2個,

所以你添加了2個null的book內容。

1 回復 有任何疑惑可以回復我~

終于搞明白了,為啥你輸出的都是null。

book=new Book();

if(qName.equals("book")){

bookIndex++;

應該是每次訪問的book標簽時創建book對象,而不是你代碼里寫的每個標簽開始都創建一個book對象。

因為一直在新建book對象,所以只能存儲當前的屬性值,下一個標簽值就自動變成null

0 回復 有任何疑惑可以回復我~

這是book類

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;

}

}


0 回復 有任何疑惑可以回復我~

可以看一下你的Book類怎么寫的嗎?另外SAXTest類的包名package com.immoc.test;是不是打錯了?

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

thomasstar 提問者

book類的代碼放到樓下啦。 另外包名沒錯,我命的名就是immoc哈哈
2017-02-19 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

為什么我輸出的value都是null呢,跟老師一樣的代碼

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號