根據業務需要,需要對獲取xml裏數據,下面是利用SAXParser進行實現的,代碼實現如下:
package tjs.utils.base.util;
import lombok.Data;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* @project: base
* @author: SJT
* @date: 2019/5/20
* @desc:
*/
@Data
public class SAXParserXml extends DefaultHandler {
String value = null;
Book book = null;
Class clazz = null;
String clazzName = null;
List<Book> bookList = new ArrayList<>();
{
try {
clazz = Class.forName("tjs.utils.base.util.Book");
String name = clazz.getName();
clazzName = toLowerCaseFirstOne(name.substring(name.lastIndexOf(".")+1));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* @desc: 用來遍歷xml開始標籤
* @author: SJT
* @date: 2019/5/21
* @param: [uri, localName, qName, attributes]
* @return: void
*/
@Override
public void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
if (qName.equals(clazzName)) {
//創建一個book對象
book = new Book();
for(int i=0;i<attributes.getLength();i++){
setProperty(clazz.getDeclaredFields(),attributes.getQName(i));
}
}
}
/**
* @desc: 用來遍歷xml結束標籤
* @author: SJT
* @date: 2019/5/21
* @param: [uri, localName, qName]
* @return: void
*/
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
Field[] fields = clazz.getDeclaredFields();
setProperty(fields,qName);
if (clazzName.equals(qName)) {
bookList.add(book);
book = null;
}
}
public void setProperty(Field[] fields,String qName){
Arrays.asList(fields).stream().forEach(x ->{
if(qName.equals(x.getName())){
try {
Method method = clazz.getDeclaredMethod("set"+toUpperCaseFirstOne(x.getName()),String.class);
method.setAccessible(true);
method.invoke(book,value);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* @desc: 獲取文本
* @author: SJT
* @date: 2019/5/21
* @param: [ch, start, length]
* @return: void
*/
@Override
public void characters(char[] ch, int start, int length)throws SAXException {
super.characters(ch, start, length);
value = new String(ch, start, length);
}
public String toLowerCaseFirstOne(String s){
return s.substring(0,1).toLowerCase()+s.substring(1);
}
public String toUpperCaseFirstOne(String s){
return s.substring(0,1).toUpperCase()+s.substring(1);
}
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
SAXParserXml parserXml = new SAXParserXml();
parser.parse(SAXParserXml.class.getClass().getResource("/xml/book.xml").getFile(),parserXml);
parserXml.getBookList().stream().forEach(x ->{
System.out.println(x.getMonth());
});
}
}
ok,這樣即可,不到之處,不要介意~.~