1 package cn.liuning.sax; 2 3 import javax.xml.parsers.SAXParser; 4 import javax.xml.parsers.SAXParserFactory; 5 6 import org.xml.sax.Attributes; 7 import org.xml.sax.ContentHandler; 8 import org.xml.sax.Locator; 9 import org.xml.sax.SAXException; 10 import org.xml.sax.XMLReader; 11 import org.xml.sax.helpers.DefaultHandler; 12 13 public class Demo1 14 { 15 /* 16 * sax解析xml文档 17 */ 18 public static void main(String[] args) throws Exception { 19 //1.创建解析工厂 20 SAXParserFactory factory = SAXParserFactory.newInstance(); 21 22 //2.得到解析器 23 SAXParser sp = factory.newSAXParser(); 24 25 //3.得到读取器 26 XMLReader reader = sp.getXMLReader(); 27 28 //4.设置内容处理器 29 reader.setContentHandler(new TagValueHandler()); 30 31 //5.读取xm文档内容 32 reader.parse("src/book.xml"); 33 } 34 } 35 //得到xml文档的所有内容,实现接口ContentHandler 36 class ListHandler implements ContentHandler 37 { 38 @Override 39 public void setDocumentLocator(Locator locator) { 40 // TODO 自动生成的方法存根 41 } 42 @Override 43 public void startDocument() throws SAXException { 44 // TODO 自动生成的方法存根 45 } 46 @Override 47 public void endDocument() throws SAXException { 48 // TODO 自动生成的方法存根 49 } 50 @Override 51 public void startPrefixMapping(String prefix, String uri) 52 throws SAXException { 53 // TODO 自动生成的方法存根 54 } 55 @Override 56 public void endPrefixMapping(String prefix) throws SAXException { 57 // TODO 自动生成的方法存根 58 } 59 @Override//开始标签 60 public void startElement(String uri, String localName, String qName, 61 Attributes atts) throws SAXException { 62 System.out.println("<" + qName + ">"); 63 //获取标签属性 64 for(int i=0;atts != null & i<atts.getLength();i++) //null 65 { 66 String attName = atts.getQName(i); 67 String attValue = atts.getValue(i); 68 69 System.out.println(attName + "=" + attValue); 70 } 71 } 72 @Override//结束标签 73 public void endElement(String uri, String localName, String qName) 74 throws SAXException { 75 System.out.println("<" + qName +">"); 76 } 77 @Override//内容 78 public void characters(char[] ch, int start, int length) 79 throws SAXException { 80 System.out.println(new String(ch,start,length)); 81 } 82 @Override 83 public void ignorableWhitespace(char[] ch, int start, int length) 84 throws SAXException { 85 } 86 @Override 87 public void processingInstruction(String target, String data) 88 throws SAXException { 89 // TODO 自动生成的方法存根 90 } 91 @Override 92 public void skippedEntity(String name) throws SAXException { 93 // TODO 自动生成的方法存根 94 } 95 } 96 //不实现ContentHandler接口,因为里面有很多用不到的方法,sun公司已经写了缺省的是吸纳类 97 //阿么我只要继承然后写自己需要的方法就可以了。右键点击源码-覆盖实现方法 98 99 //获取指定标签的值 100 class TagValueHandler extends DefaultHandler{ 101 102 private String currentTag; //记住当前解析到的是什么标签 103 private int needNumber = 1; //记住想获取第几个作者标签的值 104 private int currnetnumber=0;//当前解析到的是第几个 105 106 @Override 107 public void startElement(String uri, String localName, String qName, 108 Attributes attributes) throws SAXException { 109 110 currentTag = qName; 111 if(currentTag.equals("CreateTime")){ 112 currnetnumber++; 113 } 114 } 115 @Override 116 public void endElement(String uri, String localName, String qName) 117 throws SAXException { 118 currentTag = null; 119 } 120 @Override 121 public void characters(char[] ch, int start, int length) 122 throws SAXException { 123 124 if("CreateTime".equals(currentTag) && currnetnumber==needNumber){ 125 System.out.println(new String(ch,start,length)); 126 } 127 } 128 }