Анализатор 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 .