public class SAXReader extends DefaultHandler { java.util.Stack tags=new java.util.Stack();3 e `5 ]8 q6 E/ W4 n5 H: X9 t
//--------------XML Content-------------, F* D# S2 m3 ~5 l4 [2 m
String text=null;
$ Z& g `- u. D/ a7 C% g String url=null;
- R' f0 F- O% e% o% r, n! M String author=null;
' ^ b ~/ h/ O" m9 Y9 E String description=null;
2 a! X: X3 p, I) C, V4 q/ \ String day=null;
. o; i8 n6 {& T. c7 t/ S String year=null;
% X- M! U3 _( c, h+ o3 G String month=null;
/ g# R: R( _7 y* f0 c# p //----------------------------------------------
) S- N! O& H1 ~% R* {4 G/ b/ E1 r public void endDocument() throws SAXException {
* ~% }, b* ?- G System.out.println("------Parse End--------");
: U/ e' @4 k: h* n D/ i# W3 E }
4 e8 ^% K( X9 |* C5 R/ O% y( m3 |. } public void startDocument() throws SAXException {
" Y% k. f& Z" G [. \ System.out.println("------Parse Begin--------");( d. A$ A% `0 o
}
+ ~) J* C+ j! J9 ^ public void startElement(String p0, String p1, String p2, Attributes p3) throws SAXException {+ [0 G1 s+ H* B1 G
tags.push(p1);
8 M( j g F; t' h0 I }
2 U* A+ z/ R9 ?- j V public void endElement(String p0, String p1, String p2) throws SAXException {
, o4 n; M- `# h& g0 d8 l- A tags.pop();5 ~3 P5 J6 E+ k$ z a, R3 k0 H
//一个link节点的信息收集齐了,将其格式化输出8 t+ g8 J. F7 i$ W8 K
if (p1.equals("link")) printout();2 q& N) d4 a6 J- a
}) K; M4 S6 O8 o, F" J0 d! M
public void characters(char[] p0, int p1, int p2) throws SAXException {
+ L: r& f% r' s5 b" c //从栈中得到当前节点的信息
3 o- i3 n+ L1 Z+ b. W6 O6 Z& @ String tag=(String) tags.peek();
! G1 w9 F# {8 t5 ?" v, ~' g$ M if (tag.equals("text")) text=new String(p0,p1,p2);, f- v4 n$ v5 ?. r) A
else if (tag.equals("url")) url=new String(p0,p1,p2);
* q( X. O+ f+ s! E+ p- r else if (tag.equals("author")) author=new String(p0,p1,p2);
: k) H4 l6 G& V else if (tag.equals("day")) day=new String(p0,p1,p2);5 g6 r1 s1 q: F/ B4 A
else if (tag.equals("month")) month=new String(p0,p1,p2);
! |+ O+ m. k4 {! z9 Q. b else if (tag.equals("year")) year=new String(p0,p1,p2);
7 x( s5 k4 i: z' Z2 i: k else if (tag.equals("description")) year=new String(p0,p1,p2);
" R2 X% G' U5 B0 o! i- O) x }+ F/ ^. T! n4 Q$ E: o: w
private void printout(){$ o; `4 i5 r+ z; ]# m5 [& V( j
System.out.print("Content: ");4 W" T3 W; k' T% G4 T+ T) D
System.out.println(text);
0 H0 n$ X0 F! F System.out.print("URL: ");
" Y5 J0 |) P- N; k: n: Y+ k System.out.println(url);4 O) \) W# T4 r* O) m4 O
System.out.print("Author: ");
8 G7 L8 G- U. z! f System.out.println(author);
& _2 U( B1 B, G% U! |/ x System.out.print("Date: ");- e" e5 K+ t e. `+ i! v
System.out.println(day+"-"+month+"-"+year);( ?9 l& S+ L5 P9 R
System.out.print("Description: ");
/ d; c, {" ^& x System.out.println(description);
) B; z. I! q% }$ u; r o1 a System.out.println();" x! e% S8 O$ b" E1 x1 k- L
}
7 `; D7 E- t3 W8 ~3 K5 o9 r static public void main(String[] args) {
! X4 y6 F. a- |6 V( S String filename = null;
3 w# j9 X# ]2 J boolean validation = false;
3 P* _+ U* d; `/ g6 A. q filename="links.xml";
" a7 L, h* f D- ]" B SAXParserFactory spf = SAXParserFactory.newInstance();3 ]) r$ C8 s8 v
SAXParser saxParser=null;
' a0 u o, T* ^- T+ c2 S+ \1 P7 T# G try {% C2 i0 ]. [% b; J9 B/ t& E2 |
saxParser = spf.newSAXParser();; _- \9 n' C5 T/ U1 T
} catch (Exception ex) {
% x# F) ^+ X. v' b3 Y3 W) K- _ System.err.println(ex);
6 y0 R: T H, o D, w1 A System.exit(1);( w+ f1 q' N6 H) \
}2 N; F. o' B% H
try {
5 N) I+ J8 c0 y. H4 c/ B1 R1 n2 y7 [ saxParser.parse(new File(filename),new SAXReader());' ^+ H5 n7 ?- j4 ^4 p; f6 w* W" |" d
} catch (SAXException se) {( E8 G( q4 W1 L- b4 N9 D0 q H
System.err.println(se.getMessage());
* w# j' f) S G# x$ g( ^ System.exit(1);
; D/ M: p. a! O" g, y2 X } catch (IOException ioe) {
* ]( m* `. a4 V# Z3 T5 _9 G' _ System.err.println(ioe);$ s6 B% u; `: q( Z0 `
System.exit(1);/ M" Q& B" R+ c! ` e& M
}
0 g, ?1 k4 N# M" Y, h9 ]% D O" y }2 O8 n2 Z, v7 d" @6 g/ Q
}, k+ ~* K2 ` x9 |' Z9 q7 K: @
在这儿虽然没有使用到栈的分析,但实际上栈的分析是一件很容易的事情,应为java.util.Stack继承了java.util.Vector类,而且Stack中的元素是按栈的结构由底至上排列的,因个,我们可以使用Vector类的size()方法来得到Stack的元素个数,还可以使用Vector的get(int)方法来得到具体的每一个元属。实际上,如果把Stack的元素从底向上逐一排列出来,我们就得到了从XML根节点到当前节点的一条唯一的路径,有了这条路径的信息,文档的结构就在清楚不过了。5 F0 P* t: P4 T/ Y7 t2 r7 M6 E; N- J
小节
$ [3 m3 s1 ~2 t9 P" ^' Q5 P 好了,到这儿为止,我们已经掌握了对于XML编程的两大利器:DOM和SAX,也知道了该如何在一个Java程序中使用它们。DOM编程相对简单,但是速度比较慢,占用内存多,而SAX编程复杂一些,但是速度快,占用内存少。所以,我们应该根据不同的环境选择使用不同的方法。大部分的XML应用基本都可以用它们来解决。需要特别说明的是,DOM和SAX其实都是语言无关的,并非Java所独有,也就是说,只要有相应的语言实现,DOM和SAX可以应用在任何面向对象的语言中。 |