0
点赞
收藏
分享

微信扫一扫

XML解析-最快的方式SAX

ITWYY 2021-09-21 阅读 58
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为解析类;

如下:

1.  public  class  Book  {

3.  private  String id;
4.  private  String name;
5.  private  String author;
6.  private  String year;
7.  private  String price;
8.  private  String language;
9.  public  String getId()  {
10.  return id;
11.  }
12.  public  void setId(String id)  {
13.  this.id = id;
14.  }
15.  public  String getName()  {
16.  return name;
17.  }
18.  public  void setName(String name)  {
19.  this.name = name;
20.  }
21.  public  String getAuthor()  {
22.  return author;
23.  }
24.  public  void setAuthor(String author)  {
25.  this.author = author;
26.  }
27.  public  String getYear()  {
28.  return year;
29.  }
30.  public  void setYear(String year)  {
31.  this.year = year;
32.  }
33.  public  String getPrice()  {
34.  return price;
35.  }
36.  public  void setPrice(String price)  {
37.  this.price = price;
38.  }
39.  public  String getLanguage()  {
40.  return language;
41.  }
42.  public  void setLanguage(String language)  {
43.  this.language = language;
44.  }

46.  }

* * *

1.  public  class  SAXTest  {
2.  /**
3\.  * @param args
4\.  */
5.  public  static  void main(String[] args)  {
6.  SAXParserFactory factory =  SAXParserFactory.newInstance();
7.  try  {
8.  SAXParser parser = factory.newSAXParser();
9.  SAXParserHandler handler =  new  SAXParserHandler();
10.  parser.parse("books.xml", handler);
11.  System.out.println("~!~!~!共有"  + handler.getBookList().size()
12.  +  "本书");
13.  for  (Book book : handler.getBookList())  {
14.  System.out.println(book.getId());
15.  System.out.println(book.getName());
16.  System.out.println(book.getAuthor());
17.  System.out.println(book.getYear());
18.  System.out.println(book.getPrice());
19.  System.out.println(book.getLanguage());
20.  System.out.println("----finish----");
21.  }
22.  }  catch  (ParserConfigurationException e)  {
23.  // TODO Auto-generated catch block
24.  e.printStackTrace();
25.  }  catch  (SAXException e)  {
26.  // TODO Auto-generated catch block
27.  e.printStackTrace();
28.  }  catch  (IOException e)  {
29.  // TODO Auto-generated catch block
30.  e.printStackTrace();
31.  }
32.  }
33.  }

1.  public  class  SAXParserHandler  extends  DefaultHandler  {
2.  String value =  null;
3.  Book book =  null;
4.  private  ArrayList<Book> bookList =  new  ArrayList<Book>();
5.  public  ArrayList<Book> getBookList()  {
6.  return bookList;
7.  }

10.  int bookIndex =  0;
11.  /**
12\.  * 用来标识解析开始
13\.  */
14.  @Override
15.  public  void startDocument()  throws  SAXException  {
16.  // TODO Auto-generated method stub
17.  super.startDocument();
18.  System.out.println("SAX解析开始");
19.  }

21.  /**
22\.  * 用来标识解析结束
23\.  */
24.  @Override
25.  public  void endDocument()  throws  SAXException  {
26.  // TODO Auto-generated method stub
27.  super.endDocument();
28.  System.out.println("SAX解析结束");
29.  }

31.  /**
32\.  * 解析xml元素
33\.  */
34.  @Override
35.  public  void startElement(String uri,  String localName,  String qName,
36.  Attributes attributes)  throws  SAXException  {
37.  //调用DefaultHandler类的startElement方法
38.  super.startElement(uri, localName, qName, attributes);
39.  if  (qName.equals("book"))  {
40.  bookIndex++;
41.  //创建一个book对象
42.  book =  new  Book();
43.  //开始解析book元素的属性
44.  System.out.println("======================开始遍历某一本书的内容=================");
45.  //不知道book元素下属性的名称以及个数,如何获取属性名以及属性值
46.  int num = attributes.getLength();
47.  for(int i =  0; i < num; i++){
48.  System.out.print("book元素的第"  +  (i +  1)  +  "个属性名是:"
49.  + attributes.getQName(i));
50.  System.out.println("---属性值是:"  + attributes.getValue(i));
51.  if  (attributes.getQName(i).equals("id"))  {
52.  book.setId(attributes.getValue(i));
53.  }
54.  }
55.  }
56.  else  if  (!qName.equals("name")  &&  !qName.equals("bookstore"))  {
57.  System.out.print("节点名是:"  + qName +  "---");
58.  }
59.  }

61.  @Override
62.  public  void endElement(String uri,  String localName,  String qName)
63.  throws  SAXException  {
64.  //调用DefaultHandler类的endElement方法
65.  super.endElement(uri, localName, qName);
66.  //判断是否针对一本书已经遍历结束
67.  if  (qName.equals("book"))  {
68.  bookList.add(book);
69.  book =  null;
70.  System.out.println("======================结束遍历某一本书的内容=================");
71.  }
72.  else  if  (qName.equals("name"))  {
73.  book.setName(value);
74.  }
75.  else  if  (qName.equals("author"))  {
76.  book.setAuthor(value);
77.  }
78.  else  if  (qName.equals("year"))  {
79.  book.setYear(value);
80.  }
81.  else  if  (qName.equals("price"))  {
82.  book.setPrice(value);
83.  }
84.  else  if  (qName.equals("language"))  {
85.  book.setLanguage(value);
86.  }
87.  }

89.  @Override
90.  public  void characters(char[] ch,  int start,  int length)
91.  throws  SAXException  {
92.  // TODO Auto-generated method stub
93.  super.characters(ch, start, length);
94.  value =  new  String(ch, start, length);
95.  if  (!value.trim().equals(""))  {
96.  System.out.println("节点值是:"  + value);
97.  }
98.  }
99.  }

* * *

解析xml入库:

1.  package xmlParse;

3.  import java.io.File;
4.  import java.sql.*;
5.  import java.util.Iterator;
6.  import java.util.List;

8.  import javax.xml.parsers.SAXParser;
9.  import javax.xml.parsers.SAXParserFactory;

11.  import org.xml.sax.helpers.DefaultHandler;

13.  import java.io.IOException;

16.  public  class  JieXiXml  extends  DefaultHandler{

21.  public  static  void main(String[] args)  throws  IOException{ 

23.  System.out.println("提取xml数据并导入数据库");
24.  String path =  "C:/Users/admin/Desktop/";
25.  //读取xml文件的数据并写入数据库中
26.  //InsertData(path);
27.  BianliXML(path);
28.  //读取数据库中的数据并写入xml文档
29.  // SelectData();

32.  } 

36.  @SuppressWarnings("null")
37.  private  static  void  InsertData(String path)  {

39.  Connection conn =  null;// 创建一个数据库连接 
40.  PreparedStatement pstmt =  null;// 创建预编译语句对象,一般都是用这个而不用Statement 
41.  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 "); 
42.  //path = "C:/Users/admin/Desktop/";

44.  try{ 
45.  JdbcUtil ju =  new  JdbcUtil();
46.  conn = ju.getGJZXCon();
47.  conn.setAutoCommit(false);
48.  //准备执行sql语句

50.  //读取xml文件 

52.  // Document doc=new SAXReader().read(new InputStreamReader(
53.  //    new FileInputStream(new File(path)),"utf-8")); 
54.  // Element node = doc.getRootElement(); 
55.  //System.out.println("导入数据库的xml数据如下:\n"+ System.currentTimeMillis());

57.  // pstmt=conn.prepareStatement(sql); 
58.  //选择xml文件的节点 

60.  File file =  new  File(path);
61.  SAXParserFactory saxParFac =  SAXParserFactory.newInstance();
62.  SaxParseXml parseXml =  new  SaxParseXml();

64.  SAXParser saxParser = saxParFac.newSAXParser();
65.  saxParser.parse(file, parseXml);
66.  long s =  System.currentTimeMillis();
67.  List<XmlObj> itemList=parseXml.getContactList(); 

69.  //遍历读出的xml中的节点 
70.  int i=0;
71.  int size = itemList.size();
72.  for(Iterator<XmlObj> iter=itemList.iterator();iter.hasNext();){ 
73.  XmlObj xo = iter.next();
74.  String s1 = xo.getImei();
75.  String s2 = xo.getDes();
76.  String s3 = xo.getLen();
77.  String s4 = xo.getSorf();
78.  String s5 = xo.getFirsttime();
79.  String s6 = xo.getAccepttime();
80.  sql.append("('").append(s1).append("','");
81.  sql.append(s2).append("','");
82.  sql.append(s3).append("','");
83.  sql.append(s4).append("','");
84.  sql.append(s5).append("','");
85.  sql.append(s6).append("')");
86.  i++;
87.  if(i<size){
88.  sql.append(",");
89.  }
90.  //System.out.println(sensor_imei + "\t" + sensor_des + "\t" + sensor_length + "\t" + 
91.  //       sensor_success_or_fail + "\t" + sensor_first_time + "\t" + sensor_accept_time + "\t" + "\t" );
92.  //为sql语句赋值 
93.  /*  pstmt.setString(1, sensor_imei); 
94\.  pstmt.setString(2, sensor_des); 
95\.  pstmt.setString(3, sensor_length); 
96\.  pstmt.setString(4, sensor_success_or_fail); 
97\.  pstmt.setString(5, sensor_first_time); 
98\.  pstmt.setString(6, sensor_accept_time);   */
99.  //pstmt.addBatch(); 
100.  } 
101.  long end =  System.currentTimeMillis();;
102.  System.out.println("循环时间:\n"+  (System.currentTimeMillis()-s)/1000+"秒");
103.  pstmt=conn.prepareStatement(sql.toString()); 
104.  pstmt.executeUpdate(); 
105.  conn.commit();
106.  conn.close();
107.  pstmt.close();
108.  System.out.print("将XML文档数据导入数据库成功\n"+  (System.currentTimeMillis()-end)/1000+"秒"); 
109.  }
110.  //捕获连接数据库异常 
111.  catch  (  SQLException sqlex )  { 
112.  System.err.println(  "无法连接数据库"  ); 
113.  sqlex.printStackTrace(); 
114.  } 
115.  catch(Exception e){ 
116.  e.printStackTrace(); 
117.  }finally{ 
118.  try  { 
119.  // 逐一将上面的几个对象关闭,因为不关闭的话会影响性能、并且占用资源 
120.  // 注意关闭的顺序,最后使用的最先关闭 
121.  if  (pstmt !=  null) 
122.  pstmt.close(); 
123.  if  (conn !=  null) 
124.  conn.close(); 
125.  }  catch  (Exception e)  { 
126.  e.printStackTrace(); 
127.  } 
128.  } 
129.  }

131.  public  static  void  BianliXML(String path){
132.  // String path = "C:/Users/admin/Desktop/";

135.  File file =  new  File(path);
136.  String[] filename = file.list();
137.  for  (String obj : filename)  {
138.  if(obj.endsWith("xml")){
139.  try  {
140.  InsertData(path + obj);
141.  }  catch  (Exception e)  {
142.  System.out.println("出现异常");
143.  }
144.  // 将已读文件删除
145.  File fileBak =  new  File(path + obj);
146.  fileBak.delete();
147.  }else{
148.  continue;
149.  }
150.  }
151.  }

154.  }

* * *

1.  package xmlParse;

3.  import java.util.ArrayList;
4.  import java.util.List;

6.  import org.xml.sax.Attributes;
7.  import org.xml.sax.SAXException;
8.  import org.xml.sax.helpers.DefaultHandler;

10.  public  class  SaxParseXml  extends  DefaultHandler{
11.  //定义一个集合,用于存储联系人对象
12.  private  List<XmlObj> conList=  new  ArrayList<XmlObj>();
13.  private  XmlObj xmlobj;
14.  /*
15\.  * 定义一个变量用于记录标签的名字
16\.  * 以便关联标签与标签的文本内容
17\.  */
18.  private  String  Tag;
19.  @Override
20.  public  void startElement(String uri,  String localName,
21.  String qName,  Attributes attributes)  throws  SAXException  {
22.  Tag=qName;
23.  if("data".equals(qName)){
24.  xmlobj =  new  XmlObj();
25.  String idValue=attributes.getValue("id");
26.  //xmlobj.setId(idValue);
27.  }
28.  }

30.  @Override
31.  public  void endElement(String uri, 
32.  String localName,  String qName)  throws  SAXException  {
33.  //结束时 ,将标记置为空,防止给Contact内的值重复赋值。
34.  Tag=null;
35.  //当读到contact结束标签时,说明一个联系人读完了,存到集合中
36.  if("data".equals(qName)){
37.  conList.add(xmlobj);
38.  }
39.  }

41.  @Override
42.  public  void characters(char[] ch,  int start,  int length) 
43.  throws  SAXException  {
44.  //获取文本内容
45.  String content=new  String(ch,start,length);
46.  if("imei".equals(Tag)){
47.  xmlobj.setImei(content);
48.  }else  if("des".equals(Tag)){
49.  xmlobj.setDes(content);
50.  }else  if("len".equals(Tag)){
51.  xmlobj.setLen(content);
52.  }else  if("sorf".equals(Tag)){
53.  xmlobj.setSorf(content);
54.  }else  if("firsttime".equals(Tag)){
55.  xmlobj.setFirsttime(content);
56.  }else  if("accepttime".equals(Tag)){
57.  xmlobj.setAccepttime(content);
58.  }

60.  }
61.  public  List<XmlObj> getContactList(){
62.  return conList;
63.  }

65.  }
举报

相关推荐

0 条评论