Java編程中操作XML文件(解析方法二:SAX)

以SAX方式解析

一、準備工作
1.SAXParserFactory spf = SAXParserFactory.newInstance();
2.SAXParser sp = spf.newSAXParser();
3.新建一個DefaultHandler的子類,重寫startDocument(開始解析),endDocument(結束解析),startElement(開始元素),endElement(結束元素),character(標籤內容)方法。
4.MyHandler myHandler = new MyHandler(); //實例一個Handler對象
5.sp.parse(“books.xml”, myHandler); //將xml文件添加入流,Handler對象對其進行處理
二、Handler子類
package com.saxtest.test;
import java.util.ArrayList;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import com.saxtest.entity.Book;
public class MyHandler extends DefaultHandler{ //需要注意的是在不同方法之間實現數據共享,將變量聲明成全局變量
int bookIndex = 0;
Book book = null;
String text = null;
private ArrayList bookList = new ArrayList();
public ArrayList getBookList() {
return bookList;
}
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
System.out.println(“解析開始”);
}
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
System.out.println(“解析結束”);
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
super.startElement(uri, localName, qName, attributes);
if (qName.equals(“Book”)) {
bookIndex++;
book = new Book();
System.out.println(“=========開始遍歷第” + bookIndex + “本書=======”);
for (int i = 0; i < attributes.getLength(); i++) {
System.out.println(attributes.getQName(i) + ” = ” + attributes.getValue(i));
if (attributes.getQName(i).equals(“Id”)) {
book.setId(attributes.getValue(i));
}
}
}
else if (!qName.equals(“Book”) && !qName.equals(“Books”)) {
System.out.print(qName + ” = “);
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
// TODO Auto-generated method stub
super.endElement(uri, localName, qName);
if (!text.equals(“”)) {
switch (qName) {
case “Book” : {
bookList.add(book);
book = null;
System.out.println(“=========結束遍歷第” + bookIndex + “本書=======”);
}break;
case “Name” : book.setName(text); break;
case “Author” : book.setAuthor(text); break;
case “Year” : book.setYear(text); break;
case “Price” : book.setPrice(text); break;
case “Language” : book.setLanguage(text); break;
default : break;
}
}
// if (qName.equals(“Book”)) {
// bookList.add(book);
// book = null;
// System.out.println(“=========結束遍歷第” + bookIndex + “本書=======”);
// }
// else if (qName.equals(“Name”)) {
// book.setName(text);
// }
// else if (qName.equals(“Author”)) {
// book.setAuthor(text);
// }
// else if (qName.equals(“Year”)) {
// book.setYear(text);
// }
// else if (qName.equals(“Price”)) {
// book.setPrice(text);
// }
// else if (qName.equals(“Language”)) {
// book.setLanguage(text);
// }
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
// TODO Auto-generated method stub
super.characters(ch, start, length);
text = new String(ch, start, length);
if (!text.trim().equals(“”)) {
System.out.println(text);
}
}
}
三、新建Java實體類 //將解析的各級xml內容保存到Java中,編寫格式按javaBean
package com.saxtest.entity;
public class Book {
private String id;
private String name;
private String author;
private String year;
private String price;
private String language;
public Book(){
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getLanguage() {
return language;
}
public void setLanguage(String language) {
this.language = language;
}
public String getYear() {
return year;
}
public void setYear(String year) {
this.year = year;
}
@Override
public String toString() {
return “Book [id=” + id + “, name=” + name + “, author=” + author + “, year=” + year + “, price=” + price
+ “, language=” + language + “]”;
}
}
四、在主函數中讀取實體信息
package com.saxtest.test;
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
import com.saxtest.entity.Book;
public class SAXTest {
public static void main(String[] args) {
SAXParserFactory spf = SAXParserFactory.newInstance();
try {
SAXParser sp = spf.newSAXParser();
MyHandler myHandler = new MyHandler();
sp.parse(“books.xml”, myHandler);
for (Book item : myHandler.getBookList()) {
System.out.println(item.toString());
// System.out.println(item.getName() + “的Id爲” + item.getId() + “;”);
// System.out.println(item.getAuthor());
// System.out.println(item.getYear());
// System.out.println(item.getPrice());
// System.out.println(item.getLanguage());
}
} catch (ParserConfigurationException | SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}}}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章