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. }