//这是Test public class SAXTest { public static void main(String[] args) { // 获取一个SAXParserFactory的实例 SAXParserFactory factory = SAXParserFactory.newInstance(); // 通过factory获取SAXParser实例 try { SAXParser parser = factory.newSAXParser(); // 创建SAXParserHandler对象 SAXParserHandler handler = new SAXParserHandler(); 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("--------完成----------"); } } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
<pre name="code" class="java">//这是Handler //这里继承这个包:org.xml.sax.helpers.DefaultHandler public class SAXParserHandler extends DefaultHandler { int bookIndex = 0; // 为了方便方法之间调用参数,将value做成全局变量 String value = null; // 为了方便方法之间调用参数,将book做成全局变量 Book book = null; //为了防止每次都会覆盖掉book中的内容,这里定义一个ArrayList存储 ArrayList<Book> bookList = new ArrayList<Book>(); public ArrayList<Book> getBookList() { return bookList; } /** * 用来表示解析开始 */ public void startDocument() throws SAXException { super.startDocument(); System.out.println("SAX解析开始"); } /** * 用来表示解析开始 */ public void endDocument() throws SAXException { super.endDocument(); System.out.println("SAX解析结束"); } /** * 用来遍历xml文件的开始标签 */ public void startElement(String uri,String localName,String qName,Attributes attributes) throws SAXException { // 调用DefaultElement类的startElement方法 super.startElement(uri,localName,qName,attributes); // 开始解析book元素的属性 if (qName.equals("book")) { // 为了将解析的内容存入book对象中 book = new Book(); // Book book = new Book(); bookIndex++; System.out.println("=============开始" + bookIndex + "书内容的============"); /** * 已知属性名称,根据属性名称获取属性值 String value = attributes.getValue("id"); * System.out.println("book的属性值是: " + value); */ // 若不知道属性名称,做成循环遍历 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)); if (attributes.getQName(i).equals("id")) { book.setId(attributes.getValue(i)); } } } else if (!qName.equals("book") && !qName.equals("bookstore")) { System.out.println("节点名是: " + qName); } } /** * 用来遍历xml文件的结束标签 */ // qName决定了是遍历当中的setId、setElement还是setAuthor public void endElement(String uri,String qName) throws SAXException { // 调用DefaultHandler类的endElement方法 super.endElement(uri,qName); // 判断是否针对一本书已经遍历结束 if (qName.equals("book")) { bookList.add(book); //在遍历下一本书之前,清空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); } } // ch指的是整个xml文档内容,start指的是开始节点,length指的是元素长 // 同样这里的空行也会作为需要解析的text public void characters(char[] ch,int start,int length) throws SAXException { super.characters(ch,start,length); // String value = new String(ch,length); // 为了方便方法之间调用参数,将value做成全局变量 value = new String(ch,length); if (!value.trim().equals("")) { System.out.println("节点值是: " + value); } } }
<pre name="code" class="java">//这是Book 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; } }