SAX解析器使用回调函数(org.xml.sax.helpers.DefaultHandler)通知客户端XML文档结构。
您应该扩展DefaultHandler并重写一些方法来实现xml解析。
覆盖的方法是
- startDocument()和endDocument()–在XML文档的开头和结尾处调用的方法。
- startElement()和endElement()–在文档元素的开头和结尾处调用的方法。
- character()–以XML文档元素的开始和结束标记之间的文本内容调用的方法。
下面的示例演示使用DefaultHandler解析和XML文档。 它执行xml到模型类的映射并生成对象列表。
XML文档样本:
<?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映射到对象
/**
* 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
}
XML解析(Sax)的Java代码:
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");
}
}
解析输出:
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]]
参考:在GT's Blog上, 使用我们的JCG合作伙伴 Ganesh Tiwari 提供的完整代码 , 使用SaxParser进行XML解析 。
翻译自: https://www.javacodegeeks.com/2012/01/xml-parsing-using-saxparser-with.html