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 }