XML是一种通用的数据交换格式,它的平台无关性、语言无关性、系统无关性、给数据集成与交互带来了极大的方便。XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不同而已。
XML 的解析方式分为四种:1、 DOM 解析;2、 SAX 解析;3、 JDOM 解析;4、 DOM4J 解析。其中前两种属于基础方法,是官方提供的平台无关的解析方式;后两种属于扩展方法,它们是在基础的方法上扩展出来的,只适用于java平台。
下面主要介绍最快的解析方式SAX解析:
SAX的全称是Simple APIs for XML,也即XML简单应用程序接口。与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式。当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现对XML文档的访问,因而SAX接口也被称作事件驱动接口。
优点:
1、采用事件驱动模式,对内存耗费比较小。
2、适用于只处理XML文件中的数据时。
缺点:
1、编码比较麻烦。
2、很难同时访问XML文件中的多处不同数据。
Book为实体类;SAXTest为解析类;
如下:
public class Book {
private String id;
private String name;
private String author;
private String year;
private String price;
private String language;
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 getYear() {
return year;
}
public void setYear(String year) {
this.year = year;
}
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 class SAXTest {
/**
* @param args
*/
public static void main(String[] args) {
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
SAXParser parser = factory.newSAXParser();
SAXParserHandler handler = new SAXParserHandler();
parser.parse("books.xml", handler);
System.out.println("!!~!共有" + handler.getBookList().size()
+ "本书");
for (Book book : handler.getBookList()) {
System.out.println(book.getId());
System.out.println(book.getName());
System.out.println(book.getAuthor());
System.out.println(book.getYear());
System.out.println(book.getPrice());
System.out.println(book.getLanguage());
System.out.println("----finish----");
}
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class SAXParserHandler extends DefaultHandler {
String value = null;
Book book = null;
private ArrayList<Book> bookList = new ArrayList<Book>();
public ArrayList<Book> getBookList() {
return bookList;
}
int bookIndex = 0;
/**
* 用来标识解析开始
*/
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
System.out.println("SAX解析开始");
}
/**
* 用来标识解析结束
*/
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
System.out.println("SAX解析结束");
}
/**
* 解析xml元素
*/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
//调用DefaultHandler类的startElement方法
super.startElement(uri, localName, qName, attributes);
if (qName.equals("book")) {
bookIndex++;
//创建一个book对象
book = new Book();
//开始解析book元素的属性
System.out.println("======================开始遍历某一本书的内容=================");
//不知道book元素下属性的名称以及个数,如何获取属性名以及属性值
int num = attributes.getLength();
for(int i = 0; i < num; i++){
System.out.print("book元素的第" + (i + 1) + "个属性名是:"
+ attributes.getQName(i));
System.out.println("---属性值是:" + attributes.getValue(i));
if (attributes.getQName(i).equals("id")) {
book.setId(attributes.getValue(i));
}
}
}
else if (!qName.equals("name") && !qName.equals("bookstore")) {
System.out.print("节点名是:" + qName + "---");
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
//调用DefaultHandler类的endElement方法
super.endElement(uri, localName, qName);
//判断是否针对一本书已经遍历结束
if (qName.equals("book")) {
bookList.add(book);
book = null;
System.out.println("======================结束遍历某一本书的内容=================");
}
else if (qName.equals("name")) {
book.setName(value);
}
else if (qName.equals("author")) {
book.setAuthor(value);
}
else if (qName.equals("year")) {
book.setYear(value);
}
else if (qName.equals("price")) {
book.setPrice(value);
}
else if (qName.equals("language")) {
book.setLanguage(value);
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// TODO Auto-generated method stub
super.characters(ch, start, length);
value = new String(ch, start, length);
if (!value.trim().equals("")) {
System.out.println("节点值是:" + value);
}
}
}
解析xml入库:
package xmlParse;
import java.io.File;
import java.sql.*;
import java.util.Iterator;
import java.util.List;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.helpers.DefaultHandler;
import java.io.IOException;
public class JieXiXml extends DefaultHandler{
public static void main(String[] args) throws IOException{
System.out.println("提取xml数据并导入数据库");
String path = "C:/Users/admin/Desktop/";
//读取xml文件的数据并写入数据库中
//InsertData(path);
BianliXML(path);
//读取数据库中的数据并写入xml文档
// SelectData();
}
@SuppressWarnings("null")
private static void InsertData(String path) {
Connection conn = null;// 创建一个数据库连接
PreparedStatement pstmt = null;// 创建预编译语句对象,一般都是用这个而不用Statement
StringBuffer sql = new StringBuffer("insert into sensor_all_data(sensor_imei,sensor_des,sensor_length,sensor_success_or_fail,sensor_first_time,sensor_accept_time) values ");
//path = "C:/Users/admin/Desktop/";
try{
JdbcUtil ju = new JdbcUtil();
conn = ju.getGJZXCon();
conn.setAutoCommit(false);
//准备执行sql语句
//读取xml文件
// Document doc=new SAXReader().read(new InputStreamReader(
// new FileInputStream(new File(path)),"utf-8"));
// Element node = doc.getRootElement();
//System.out.println("导入数据库的xml数据如下:\n"+ System.currentTimeMillis());
// pstmt=conn.prepareStatement(sql);
//选择xml文件的节点
File file = new File(path);
SAXParserFactory saxParFac = SAXParserFactory.newInstance();
SaxParseXml parseXml = new SaxParseXml();
SAXParser saxParser = saxParFac.newSAXParser();
saxParser.parse(file, parseXml);
long s = System.currentTimeMillis();
List<XmlObj> itemList=parseXml.getContactList();
//遍历读出的xml中的节点
int i=0;
int size = itemList.size();
for(Iterator<XmlObj> iter=itemList.iterator();iter.hasNext();){
XmlObj xo = iter.next();
String s1 = xo.getImei();
String s2 = xo.getDes();
String s3 = xo.getLen();
String s4 = xo.getSorf();
String s5 = xo.getFirsttime();
String s6 = xo.getAccepttime();
sql.append("('").append(s1).append("','");
sql.append(s2).append("','");
sql.append(s3).append("','");
sql.append(s4).append("','");
sql.append(s5).append("','");
sql.append(s6).append("')");
i++;
if(i<size){
sql.append(",");
}
//System.out.println(sensor_imei + "\t" + sensor_des + "\t" + sensor_length + "\t" +
// sensor_success_or_fail + "\t" + sensor_first_time + "\t" + sensor_accept_time + "\t" + "\t" );
//为sql语句赋值
/* pstmt.setString(1, sensor_imei);
pstmt.setString(2, sensor_des);
pstmt.setString(3, sensor_length);
pstmt.setString(4, sensor_success_or_fail);
pstmt.setString(5, sensor_first_time);
pstmt.setString(6, sensor_accept_time); */
//pstmt.addBatch();
}
long end = System.currentTimeMillis();;
System.out.println("循环时间:\n"+ (System.currentTimeMillis()-s)/1000+"秒");
pstmt=conn.prepareStatement(sql.toString());
pstmt.executeUpdate();
conn.commit();
conn.close();
pstmt.close();
System.out.print("将XML文档数据导入数据库成功\n"+ (System.currentTimeMillis()-end)/1000+"秒");
}
//捕获连接数据库异常
catch ( SQLException sqlex ) {
System.err.println( "无法连接数据库" );
sqlex.printStackTrace();
}
catch(Exception e){
e.printStackTrace();
}finally{
try {
// 逐一将上面的几个对象关闭,因为不关闭的话会影响性能、并且占用资源
// 注意关闭的顺序,最后使用的最先关闭
if (pstmt != null)
pstmt.close();
if (conn != null)
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void BianliXML(String path){
// String path = "C:/Users/admin/Desktop/";
File file = new File(path);
String[] filename = file.list();
for (String obj : filename) {
if(obj.endsWith("xml")){
try {
InsertData(path + obj);
} catch (Exception e) {
System.out.println("出现异常");
}
// 将已读文件删除
File fileBak = new File(path + obj);
fileBak.delete();
}else{
continue;
}
}
}
}
package xmlParse;
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SaxParseXml extends DefaultHandler{
//定义一个集合,用于存储联系人对象
private List<XmlObj> conList= new ArrayList<XmlObj>();
private XmlObj xmlobj;
/*
* 定义一个变量用于记录标签的名字
* 以便关联标签与标签的文本内容
*/
private String Tag;
@Override
public void startElement(String uri, String localName,
String qName, Attributes attributes) throws SAXException {
Tag=qName;
if("data".equals(qName)){
xmlobj = new XmlObj();
String idValue=attributes.getValue("id");
//xmlobj.setId(idValue);
}
}
@Override
public void endElement(String uri,
String localName, String qName) throws SAXException {
//结束时 ,将标记置为空,防止给Contact内的值重复赋值。
Tag=null;
//当读到contact结束标签时,说明一个联系人读完了,存到集合中
if("data".equals(qName)){
conList.add(xmlobj);
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
//获取文本内容
String content=new String(ch,start,length);
if("imei".equals(Tag)){
xmlobj.setImei(content);
}else if("des".equals(Tag)){
xmlobj.setDes(content);
}else if("len".equals(Tag)){
xmlobj.setLen(content);
}else if("sorf".equals(Tag)){
xmlobj.setSorf(content);
}else if("firsttime".equals(Tag)){
xmlobj.setFirsttime(content);
}else if("accepttime".equals(Tag)){
xmlobj.setAccepttime(content);
}
}
public List<XmlObj> getContactList(){
return conList;
}
}
网友评论