java 中的SAX解析XML的使用(一)
读取的XML文件如下:
<?xml version="1.0" encoding="UTF-8"?><books><book id="1"><name>Thinking in java</name><price>89</price></book><book id="3"><name>Spring in Action</name><price>46</price></book><book id="9"><name>Java Web development start</name><price>12</price></book></books>
public class SAXTest {public static void main(String[] args) throws Exception {// TODO Auto-generated method stubgetBooks();}public static void getBooks() throws Exception{List<Book> books = new ArrayList<Book>();//保存bookSAXParserFactory saxFactory = SAXParserFactory.newInstance();//sax转换工厂类SAXParser parser = saxFactory.newSAXParser();//创建一个新的转换器//文件输入流FileInputStream fi = new FileInputStream(SAXTest.class.getClassLoader().getResource("Test.xml").getPath());SAXHandler handler = new SAXHandler(books);//xml处理类parser.parse(fi, handler);//读取xmlbooks = handler.getBooks();//获取booksfor(Book book : books)//输出{System.out.println("ID: " + book.getId() + " Name: "+ book.getName() + " Price: " + book.getPrice());}}}//xml文件读取的处理类public class SAXHandler extends DefaultHandler {//存放书籍private List<Book> books ;private String preElement = null;//存放之前一个Elementprivate Book book = null;//存放一本书public SAXHandler(List<Book> books){this.books = books;}public SAXHandler(){}public List<Book> getBooks(){return books;//返回list}@Overridepublic void startDocument() throws SAXException {//标识文档的开始System.out.println("the document start");//创建一个list来books = new ArrayList<Book>();super.startDocument();}@Overridepublic void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {//当一个元素开始时,调用此方法System.out.println("start element " + qName);if("book".equals(qName)){book = new Book();//创建一本书book.setId(Integer.parseInt(attributes.getValue(0)));}preElement = qName;//获取当前元素}@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {//一个元素结束时调用此方法System.out.println("end element " + qName);if("book".equals(qName))//判断当前结束的元素是不是book{books.add(book);//加入list中book = null;//清空System.out.println();//换一行}preElement = null;//将前一个元素清空}@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {//当为文本节点时调用此方法//判断上个节点是不是nameif("name".equals(preElement)){if(book == null){book = new Book();}book.setName(new String(ch,start,length));}//判断上个节点是否priceif("price".equals(preElement)){if(book == null){book = new Book();}book.setPrice(Float.parseFloat(new String(ch,start,length)));}}@Overridepublic void endDocument() throws SAXException {//文档结束时调用System.out.println("end document !");}}