为什么我的输出不对,我觉得算法和老师的一样,而且在主函数调用时,容器的长度返回值为0

来源:3-4 使用 SAX 解析将 XML 的内容和结构存入 JAVA 对象

qq_筑城以北_04274162

2017-04-19 21:37

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

解析结束!


写回答 关注

1回答

  • 横空hero
    2017-04-20 22:47:27
    已采纳

    startElement()方法中,只有在qName.equals("book")的时候,book才实例化(  book = new Books()  ).

Java眼中的XML---文件读取

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

83199 学习 · 431 问题

查看课程

相似问题