Java解析xml之SAX,Java,解析,xml,SAX
在上一節介紹了java用DOM的方式解析XML,本文用的到test.xml,請參考上節。
-------------------------------------------
--------------------------------------------------------------------------
SAX不用將整個文檔加載到內存,基于事件驅動的API(Observer模式),用戶只需要注冊自己感興趣的事件即可。SAX提供EntityResolver, DTDHandler, ContentHandler, ErrorHandler接口,分別用于監聽解析實體事件、DTD處理事件、正文處理事件和處理出錯事件,與AWT類似,SAX還提供了一個對這4個接口默認的類DefaultHandler(這里的默認實現,其實就是一個空方法),一般只要繼承DefaultHandler,重寫自己感興趣的事件即可。
1
package test.xml;
2
3
import java.io.IOException;
4
import java.io.InputStream;
5
6
import javax.xml.parsers.ParserConfigurationException;
7
import javax.xml.parsers.SAXParser;
8
import javax.xml.parsers.SAXParserFactory;
9
10
import org.xml.sax.Attributes;
11
import org.xml.sax.InputSource;
12
import org.xml.sax.Locator;
13
import org.xml.sax.SAXException;
14
import org.xml.sax.SAXParseException;
15
import org.xml.sax.helpers.DefaultHandler;
16
17
/**
18
*
19
* @author whwang
20
*/
21
public class TestSAX {
22
23
public static void main(String[] args) {
24
read();
25
write();
26
}
27
28
public static void read() {
29
try {
30
SAXParserFactory factory = SAXParserFactory.newInstance();
31
SAXParser parser = factory.newSAXParser();
32
InputStream in = TestSAX.class.getClassLoader().getResourceAsStream("test.xml");
33
parser.parse(in, new MyHandler());
34
} catch (ParserConfigurationException e) {
35
e.printStackTrace();
36
} catch (SAXException e) {
37
e.printStackTrace();
38
} catch (IOException e) {
39
e.printStackTrace();
40
}
41
}
42
43
public static void write() {
44
System.err.println("純SAX對于寫操作無能為力");
45
}
46
47
}
48
49
// 重寫對自己感興趣的事件處理方法
50
class MyHandler extends DefaultHandler {
51
52
@Override
53
public InputSource resolveEntity(String publicId, String systemId)
54
throws IOException, SAXException {
55
return super.resolveEntity(publicId, systemId);
56
}
57
58
@Override
59
public void notationDecl(String name, String publicId, String systemId)
60
throws SAXException {
61
super.notationDecl(name, publicId, systemId);
62
}
63
64
@Override
65
public void unparsedEntityDecl(String name, String publicId,
66
String systemId, String notationName) throws SAXException {
67
super.unparsedEntityDecl(name, publicId, systemId, notationName);
68
}
69
70
@Override
71
public void setDocumentLocator(Locator locator) {
72
super.setDocumentLocator(locator);
73
}
74
75
@Override
76
public void startDocument() throws SAXException {
77
System.err.println("開始解析文檔");
78
}
79
80
@Override
81
public void endDocument() throws SAXException {
82
System.err.println("解析結束");
83
}
84
85
@Override
86
public void startPrefixMapping(String prefix, String uri)
87
throws SAXException {
88
super.startPrefixMapping(prefix, uri);
89
}
90
91
@Override
92
public void endPrefixMapping(String prefix) throws SAXException {
93
super.endPrefixMapping(prefix);
94
}
95
96
@Override
97
public void startElement(String uri, String localName, String qName,
98
Attributes attributes) throws SAXException {
99
System.err.print("Element: " + qName + ", attr: ");
100
print(attributes);
101
}
102
103
@Override
104
public void endElement(String uri, String localName, String qName)
105
throws SAXException {
106
super.endElement(uri, localName, qName);
107
}
108
109
@Override
110
public void characters(char[] ch, int start, int length)
111
throws SAXException {
112
super.characters(ch, start, length);
113
}
114
115
@Override
116
public void ignorableWhitespace(char[] ch, int start, int length)
117
throws SAXException {
118
super.ignorableWhitespace(ch, start, length);
119
}
120
121
@Override
122
public void processingInstruction(String target, String data)
123
throws SAXException {
124
super.processingInstruction(target, data);
125
}
126
127
@Override
128
public void skippedEntity(String name) throws SAXException {
129
super.skippedEntity(name);
130
}
131
132
@Override
133
public void warning(SAXParseException e) throws SAXException {
134
super.warning(e);
135
}
136
137
@Override
138
public void error(SAXParseException e) throws SAXException {
139
super.error(e);
140
}
141
142
@Override
143
public void fatalError(SAXParseException e) throws SAXException {
144
super.fatalError(e);
145
}
146
147
private void print(Attributes attrs) {
148
if (attrs == null) return;
149
System.err.print("[");
150
for (int i = 0; i < attrs.getLength(); i++) {
151
System.err.print(attrs.getQName(i) + " = " + attrs.getValue(i));
152
if (i != attrs.getLength() - 1) {
153
System.err.print(", ");
154
}
155
}
156
System.err.println("]");
157
}
158
}
159

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159
