import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
public class SAXandbeanQue {
public static void main(String arg[]) throws ParserConfigurationException, SAXException, IOException {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
XMLReader reader = parser.getXMLReader();
BeanListHandler1 handler = new BeanListHandler1();
reader.setContentHandler(handler);
reader.parse("E://hedwig//lomboz//javaweb30//1.xml");
List<BookBean> list = handler.getList(); //必须用设置在读取器中的CONTENTHANDLER的list
System.out.print(list);
}
}
//把xml中的每本书都封装到一个book对象,并且把多个book对象都放在一个list集合中返回
class BeanListHandler1 extends DefaultHandler {
private List<BookBean> list = null;//选中List右键Source选择generate gettings and settings
private BookBean bean = null;
private String element = null; //用于标记标签名称
public BeanListHandler1() {
}
@Override
public void startElement(String uri, String localName, String name,
Attributes attributes) throws SAXException {
this.element = name; //标签名称都暂存
if("BOOKSHELF".equals(this.element)) list = new ArrayList<BookBean>();
else if("BOOK".equals(this.element)) bean = new BookBean(); //遇到标签BOOK即new bookbean
}
@Override //右键source再overide/inplement
public void characters(char[] ch, int start, int length)
throws SAXException {
if("NAME".equals(element)) {
this.bean.setName( new String(ch,start,length)); //如果标签名为NAME,则将标签内容存放到bean.name
}
if("PRICE".equals(element)) { //将element放equals前面,也会报空指针异常
this.bean.setPrice(new String(ch,start,length));
}
if("ID".equals(element)) {
this.bean.setID(new String(ch,start,length));
}
if("WRITER".equals(element)) {
this.bean.setWriter(new String(ch,start,length));
}
if("SERIES".equals(element)) {
this.bean.setSeries(new String(ch,start,length));
}
}
@Override
public void endElement(String uri, String localName, String name)
throws SAXException {
if("BOOK".equals(name)) {
this.list.add(bean);
bean = null;
} //只有一个bookshelf,不能置空,否则什么都没
/*else if("BOOKSHELF".equals(name)) {
System.out.println(bean);
} */
System.out.println(element);
this.element = null; //必须置空,因为读取文档空白部分会在调用character方法,而此时
//element为上一个标签内容,会将空白作为char[] ch传递。当</BOOK>时,调用endElement,
//使bean置空,之后遇到文档空白空白,调用character方法,而此时element为上一个标签SERIES,
//会将空白作为char[] ch传递并调用bean的setSeries方法。bean此时为null,故报空指针异常。
}
public List<BookBean> getList() {
return this.list;
}
}
Exception in thread "main" java.lang.NoClassDefFoundError: BookBean
at BeanListHandler1.startElement(SAXandbeanQue.java:44)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:509)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(XMLDocumentFragmentScannerImpl.java:1363)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2786)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1140)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:661)
at SAXandbeanQue.main(SAXandbeanQue.java:24)
Caused by: java.lang.ClassNotFoundException: BookBean
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 12 more
这是BookBean
private String name;
private String price;
private String id;
private String writer;
private String series;
public BookBean() {
}
public BookBean(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public void setPrice(String price) {
this.price = price;
}
public String getPrice() {
return this.price;
}
public void setID(String id) {
this.id = id;
}
public String getID() {
return this.id;
}
public void setWriter(String writer) {
this.writer = writer;
}
public String getWriter() {
return this.writer;
}
public void setSeries(String series) {
this.series = series;
}
public String getSeries() {
return this.series;
}
}