sax和传统的Dom操作XML相比较更加灵活,不会因为XML文件过大占用太多内存,他是随时去扫面XML内容,根据用户设置的节点获取属性值或者节点值
每个处理XML的Class都要继承DefaultHandler
重写五个个方法 文档、节点的开始和结束都是出发相应的方法,获取所需数据和操作 当访问到节点数据值时会执行characters
方法 获取值
- startDocument()方法只会在文档开始解析的时候被调用,每次解析只会调用一次。
- startElement()方法每次在开始解析一个元素,即遇到元素标签开始的时候都会调用。
- characters()方法也是在每次解析到元素标签携带的内容时都会调用,即使该元素标签的内容为空或换行。而且如果元素内嵌套元素,在父元素结束标签前, characters()方法会再次被调用,此处需要注意。
- endElement()方法每次在结束解析一个元素,即遇到元素标签结束的时候都会调用。
- endDocument() startDocument()方法只会在文档解析结束的时候被调用,每次解析只会调用一次
XMl文件如下
<?xml version="1.0" encoding="UTF-8"?> <books> <book id="12"> <name>thinking in java</name> <price>85.5</price> </book> <book id="15"> <name>Spring in Action</name> <price>39.0</price> </book> </books>
MyHandler 代码如下
package com.steben; import java.util.ArrayList; import org.xml.sax.helpers.DefaultHandler; import org.xml.sax.Attributes; public class MyHandler extends DefaultHandler { private ArrayList<Book> bookList; private String tabNameString; private Book books; /* public MyHandler(String tabNameString){ this.tabNameString=tabNameString; } */ public ArrayList<Book> getBooks(){ return bookList; } @Override public void startDocument(){ this.bookList=new ArrayList<Book>(); } @Override public void startElement(String url,String localName,String qName,Attributes attributes){ this.tabNameString=qName; if(tabNameString.equals("book")){ books=new Book(); books.setId(Integer.parseInt(attributes.getValue(0))); } //System.out.println(qName); } @Override public void characters(char[] ch, int start, int length) throws org.xml.sax.SAXException { if(tabNameString!=null){ String dataString=new String(ch,start,length); if(tabNameString.equals("name")){ books.setName(dataString); }else if(tabNameString.equals("price")){ books.setPrice(Double.parseDouble(dataString)); } } } @Override public void endElement(String uri,String localName,String qName){ if(qName.equals("book")){ bookList.add(books); } tabNameString=null; //System.out.println(qName); } }
Book实体类
package com.steben; public class Book { private int id; private String name; private double price; public int getId(){ return id; } public void setId(int id){ this.id=id; } public String getName(){ return name; } public void setName(String name){ this.name=name; } public double getPrice(){ return price; } public void setPrice(double price){ this.price=price; } }
程序入口
package com.steben; import java.io.IOException; import java.util.ArrayList; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.SAXException; public class SaxXml { public static void main(String[] args) { try { ArrayList<Book> bookList=ReadXml("c://ee.xml"); for (Book book : bookList) { System.out.print(book.getId()+"/"+book.getName()+"/"+book.getPrice()); } } catch (Exception e) { System.out.print(e.getMessage()); } //System.out.print("Steben"); } public static ArrayList<Book> ReadXml(String Url) { MyHandler myHandler=new MyHandler(); try { SAXParserFactory saxParserFactory=SAXParserFactory.newInstance(); SAXParser saxParser=saxParserFactory.newSAXParser(); saxParser.parse(Url, myHandler); } catch (Exception e) { // TODO: handle exception System.out.print(e); } return myHandler.getBooks(); } }
来源:https://www.cnblogs.com/steben/p/3959501.html