TestSax类:
package day06_parser.sax; /** * xml的解析技术:JAXP是Java API for XML Processing的英文字头缩写,* 中文含义是:用于XML文档处理的使用Java语言编写的编程接口。JAXP支持DOM、SAX、XSLT等标准。 * 下面我们研究两种解析方式: * 1.dom解析 2.sax解析:Simple API for XML * 下面是dom解析的实例。 * JAXP-DOM解析实例: * 下面的实例实现的功能是,通过javax.xml包实现sax方式的xml的解析 * 具体的操作有增加节点,删除节点,修改节点内容,查询节点信息 */ import java.io.File; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import day06_parser.domain.Book; public class TestSax { /* xml的第二种解析方式:sax:simple api for xml 1.SAX 是事件驱动的 XML 处理方法 2.逐行扫描文档,一边扫描一边解析 3.SAX来说就是操作复杂 4.仅需实现部分接口时扩展org.xml.sax.helpers.DefaultHandler类 5.DefaultHandler类默认的空实现 */ public static void main(String[] args) throws Exception { // TODO Auto-generated method stub demo1(); } public static void demo1() throws Exception{ //1.工厂 SAXParserFactory factory=SAXParserFactory.newInstance(); //2.解析器 SAXParser parser=factory.newSAXParser(); //解析xml //定义默认的defaultHander类,处理的方法 MyDefaultHandler dh=new MyDefaultHandler(); parser.parse(new File("db.xml"),dh); List<Book> allBookList = dh.getData(); //获得所有的书籍(JavaBean)数据 for (Book book : allBookList) { System.out.println(book); } //###############################3 //存放方式1: 一个map存放一本书 Map<String,String> data = new HashMap<String,String>(); data.put("id","b001"); data.put("title","xxxx"); data.put("price","100"); //方式2:面向对象,用于封装数据对象,JavaBean Book book = new Book(); book.setId("b001"); book.setTitle("java web"); } }
sax解析的核心类:MyDefaultHander类
package day06_parser.sax; //这个类就是sax解析的核心类。 import java.util.ArrayList; import java.util.List; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import day06_parser.domain.Book; public class MyDefaultHandler extends DefaultHandler { //1用于缓存处理数据 private List<Book> data; // 4 用于缓存当前的标签名称(元素名称) private String elementName; //以上的这些数据在dom方式里面存储在document对象里面了。 @Override public void startDocument() throws SAXException { //2对容器进行初始化 data = new ArrayList<Book>(); } /** * * xml没有约束 * uri # null * localname#null * qName # 元素名称 * * xml 约束 * uri # 命名空间值 targatNamespace="xxxxx" * localname # 元素名称 <table> * qName # 前缀:名称 <my:table> */ @Override public void startElement(String uri,String localName,String qName,Attributes attributes) throws SAXException { if("book".equals(qName)){ // 3.1 说明解析到了一个新书 Book book = new Book(); // 3.2 添加到list中 data.add(book); // 3.3 缓存id属性 book.setId(attributes.getValue("id")); } this.elementName = qName; } @Override public void characters(char[] ch,int start,int length) throws SAXException { String value = new String(ch,start,length); if("title".equals(elementName)){ //value 表示title的数据 data.get(data.size() - 1).setTitle(value); } if("price".equals(elementName)){ //value 表示title的数据 data.get(data.size() - 1).setPrice(value); } if("author".equals(elementName)){ //value 表示title的数据 data.get(data.size() - 1).setAuthor(value); } //使用过后清空缓存 this.elementName = null; } @Override public void endElement(String uri,String qName) throws SAXException { System.out.println("元素结束"); } @Override public void endDocument() throws SAXException { System.out.println("文档结束"); } /** * 用于返回处理过的所有数据 * @return */ public List<Book> getData() { return data; } }
另外还用到了两个类:
book类-javebean:
package day06_parser.domain; /** * 普通的类,她就是javabean * * 提供相应的私有字段,封装数据 * * 提供字段的相应的getter或setter方法 * @author hym * */ public class Book { private String id; private String title; private String price; private String author; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getPrice() { return price; } public void setPrice(String price) { this.price = price; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } @Override public String toString() { return "Book [id=" + id + ",title=" + title + ",price=" + price + ",author=" + author + "]"; } }
需要解析的xml文件:
db.xml
<?xml version="1.0" encoding="UTF-8"?> <books> <book id="b001"> <title>android</title> <price>28</price> <author>胡爷</author> </book> <book id="b002">修改了节点的文本内容 <title>修改了节点的文本内容</title>修改了节点的文本内容 <price>修改了节点的文本内容</price>修改了节点的文本内容 <author>修改了节点的文本内容</author>修改了节点的文本内容 </book> </books>