Анализатор SAX использует функцию обратного вызова (org.xml.sax.helpers.DefaultHandler) для информирования клиентов о структуре документа XML. Вы должны расширить DefaultHandler и переопределить несколько методов для достижения анализа XML.
Методы для переопределения:
- startDocument () и endDocument () — метод, вызываемый в начале и в конце XML-документа.
- startElement () и endElement () — Метод, вызываемый в начале и конце элемента документа.
- characters () — Метод, вызываемый с текстовым содержимым между начальным и конечным тегами элемента документа XML.
В следующем примере демонстрируется использование DefaultHandler для анализа и XML-документа. Он выполняет отображение xml на класс модели и генерирует список объектов.
Образец XML-документа:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
<? xml version = "1.0" encoding = "UTF-8" ?> < catalog > < book id = "001" lang = "ENG" > < isbn >23-34-42-3</ isbn > < regDate >1990-05-24</ regDate > < title >Operating Systems</ title > < publisher country = "USA" >Pearson</ publisher > < price >400</ price > < authors > < author >Ganesh Tiwari</ author > </ authors > </ book > < book id = "002" > < isbn >24-300-042-3</ isbn > < regDate >1995-05-12</ regDate > < title >Distributed Systems</ title > < publisher country = "Nepal" >Ekata</ publisher > < price >500</ price > < authors > < author >Mahesh Poudel</ author > < author >Bikram Adhikari</ author > < author >Ramesh Poudel</ author > </ authors > </ book > </ catalog > |
Класс модели для объекта Book для отображения xml на объект
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
/** * Book class stores book information, after parsing the xml * @author Ganesh Tiwari */ public class Book { String lang; String title; String id; String isbn; Date regDate; String publisher; int price; List< String > authors; public Book(){ authors=new ArrayList< String >(); } //getters and setters } |
Java-код для синтаксического анализа XML (Sax):
01
02
03
04
05
06
07
08
09
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
|
import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class MySaxParser extends DefaultHandler { List<Book> bookL; String bookXmlFileName; String tmpValue; Book bookTmp; SimpleDateFormat sdf= new SimpleDateFormat( "yy-MM-dd" ); public MySaxParser(String bookXmlFileName) { this .bookXmlFileName = bookXmlFileName; bookL = new ArrayList<Book>(); parseDocument(); printDatas(); } private void parseDocument() { // parse SAXParserFactory factory = SAXParserFactory.newInstance(); try { SAXParser parser = factory.newSAXParser(); parser.parse(bookXmlFileName, this ); } catch (ParserConfigurationException e) { System.out.println( "ParserConfig error" ); } catch (SAXException e) { System.out.println( "SAXException : xml not well formed" ); } catch (IOException e) { System.out.println( "IO error" ); } } private void printDatas() { // System.out.println(bookL.size()); for (Book tmpB : bookL) { System.out.println(tmpB.toString()); } } @Override public void startElement(String s, String s1, String elementName, Attributes attributes) throws SAXException { // if current element is book , create new book // clear tmpValue on start of element if (elementName.equalsIgnoreCase( "book" )) { bookTmp = new Book(); bookTmp.setId(attributes.getValue( "id" )); bookTmp.setLang(attributes.getValue( "lang" )); } // if current element is publisher if (elementName.equalsIgnoreCase( "publisher" )) { bookTmp.setPublisher(attributes.getValue( "country" )); } } @Override public void endElement(String s, String s1, String element) throws SAXException { // if end of book element add to list if (element.equals( "book" )) { bookL.add(bookTmp); } if (element.equalsIgnoreCase( "isbn" )) { bookTmp.setIsbn(tmpValue); } if (element.equalsIgnoreCase( "title" )) { bookTmp.setTitle(tmpValue); } if (element.equalsIgnoreCase( "author" )){ bookTmp.getAuthors().add(tmpValue); } if (element.equalsIgnoreCase( "price" )){ bookTmp.setPrice(Integer.parseInt(tmpValue)); } if (element.equalsIgnoreCase( "regDate" )){ try { bookTmp.setRegDate(sdf.parse(tmpValue)); } catch (ParseException e) { System.out.println( "date parsing error" ); } } } @Override public void characters( char [] ac, int i, int j) throws SAXException { tmpValue = new String(ac, i, j); } public static void main(String[] args) { new MySaxParser( "catalog.xml" ); } } |
Выход синтаксического анализа:
1
2
|
Book [lang=ENG, title=Operating Systems, id =001, isbn=23-34-42-3, regDate=Thu May 24 00:00:00 NPT 1990, publisher=USA, price=400, authors=[Ganesh Tiwari]] Book [lang=null, title=Distributed Systems, id =002, isbn=24-300-042-3, regDate=Fri May 12 00:00:00 NPT 1995, publisher=Nepal, price=500, authors=[Mahesh Poudel, Bikram Adhikari, Ramesh Poudel]] |
Справка: синтаксический анализ XML с использованием SaxParser с полным кодом от нашего партнера по JCG Ганеша Тивари в блоге GT .