1. 程式人生 > >java基礎74 XML解析中的SAX解析相關知識點(網頁知識)

java基礎74 XML解析中的SAX解析相關知識點(網頁知識)

1、SAX解析工具

    SAX解析工具:是Sun公司提供的,內建JDK中。org.xml.sax.*        

2、SAX解析的核心API

SAXParser類:用於讀取和解析xml檔案物件
    parse(File f, DefaultHandler dh)方法----->解析xml檔案
        引數一:file:表示讀取xml檔案
        引數二:DefaultHandler:SAX事件處理程式.使用DefaultHandler的子類 

DefaultHandler類:
    void  startDocument():在讀文件開始時呼叫
    void  endDocument():

在讀文件結束時呼叫
    void  startElement(String uri, String localName, String qName, Attributes attributes):讀到開始標籤時呼叫
    void  endElement(String uri, String localName, String qName):讀到結束標籤時呼叫
    void  characters(char[] ch, int start, int length):讀到文字內容時呼叫

3、SAX解析原理和DOM解析原理的區別

DOM解析原理 SAX解析原理
1、一次性載入xml文件,不適合大容量的讀取檔案
2、DOM解析可以任意進行增刪改
3、DOM解析任意的讀取任何位置的資料,甚至往回讀
4、DOM解析面向物件的程式設計方法(Node,Element,Attribute),java開發者編碼比較簡單
1、載入一點,讀取一點,處理一點。適合大容量檔案讀取
2、SAX解析只能讀取
3、SAX解析只能衝上往下,按順序的讀取,不能回讀
4、SAX解析基於事件的程式設計方法.java開發編碼相對複雜

4、例項

例1:用SAX解析讀取xml文件

 1 package com.shore.sax;
 2 
 3 import java.io.File;
 4 
 5 import javax.xml.parsers.ParserConfigurationException;
 6 import javax.xml.parsers.SAXParser;
 7 import javax.xml.parsers.SAXParserFactory;
8 9 import org.xml.sax.SAXException; 10 11 public class Demo1 { 12 public static void main(String[] args) throws Exception, SAXException { 13 //1.建立SAXParser物件 14 SAXParser parser=SAXParserFactory.newInstance().newSAXParser(); 15 //2.呼叫parser方法 16 /* 17 * 引數一:xml文件 18 * 引數二:DefaultHandler的子類 19 * */ 20 parser.parse(new File("./src/contact.xml"),new MyDefaultHandler()); 21 } 22 }
 1 package com.shore.sax;
 2 
 3 import org.xml.sax.Attributes;
 4 import org.xml.sax.SAXException;
 5 import org.xml.sax.helpers.DefaultHandler;
 6 
 7 public class MyDefaultHandler extends DefaultHandler {
 8     /*
 9      * 開始文件時呼叫
10      * */
11     @Override
12     public void startDocument() throws SAXException {
13         System.out.println("startDocument");
14     }
15     /*
16      * 開始標籤時呼叫
17      * @param qName:表示開始標籤的標籤名
18      * @param attributes:表示開始標籤內的包含的屬性列表
19      */
20     @Override
21     public void startElement(String uri, String localName, String qName,
22             Attributes attributes) throws SAXException {
23         System.out.println("startElement"+"----->"+qName);
24     }
25     /*
26      * 結束標籤時呼叫
27      * @param qName:結束標籤的標籤名
28      * */
29     @Override
30     public void endElement(String uri, String localName, String qName)
31             throws SAXException {
32         System.out.println("endElement"+"----->"+qName);
33     }
34     /*
35      *讀到文字內容時呼叫
36      * @param ch:表示當前讀取到的所有文字內容
37      * @param start:表示當前文字內容的開始位置
38      * @param length:表示當前文字內容長度
39      */
40     @Override
41     public void characters(char[] ch, int start, int length)
42             throws SAXException {
43         String content=new String(ch,start,length);//獲取文字內容
44         System.out.println("characters"+"----->"+content);
45     }
46     /*
47      * 結束文件時呼叫
48      * */
49     @Override
50     public void endDocument() throws SAXException {
51         System.out.println("endDocument");
52     }
53 }

contact.xml文件

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <contactList>
 3     <contact id="001" sex="男">
 4         <name>張三</name>
 5         <age>18</age>
 6         <phone>15779593710</phone>
 7         <email>[email protected]</email>
 8         <qq>872855221</qq>
 9     </contact>
10 </contactList>

結果圖

附錄1

 1 package com.shore.code;
 2 
 3 import java.io.File;
 4 import java.io.IOException;
 5 
 6 import javax.xml.parsers.ParserConfigurationException;
 7 import javax.xml.parsers.SAXParser;
 8 import javax.xml.parsers.SAXParserFactory;
 9 
10 import org.xml.sax.SAXException;
11 
12 /**
13  * @author DSHORE / 2018-9-6
14  *
15  */
16 /*
17  * 讀取contact.xml檔案,完整輸出文件內容
18  * */
19 public class Demo6 {
20     public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
21         //1.建立SAXParser
22         SAXParser parser=SAXParserFactory.newInstance().newSAXParser();
23         //讀取xml1檔案
24         MyDefaultHander2 hander=new MyDefaultHander2();
25         parser.parse(new File("./src/contact.xml"),hander);
26         String content=hander.getContent();
27         System.out.println(content);
28     }
29 }

MyDefaultHander2.java

 1 package com.shore.code;
 2 
 3 import org.xml.sax.Attributes;
 4 import org.xml.sax.SAXException;
 5 import org.xml.sax.helpers.DefaultHandler;
 6 
 7 /**
 8  * @author DSHORE / 2018-9-6
 9  *
10  */
11 public class MyDefaultHander2 extends DefaultHandler{
12     //儲存xml文件資訊
13     private StringBuffer sb=new StringBuffer();
14     
15     public String getContent(){//作用:把讀到的所有內容toString一下(變成字串的形式)
16         return sb.toString();
17     }
18     //開始標籤
19     @Override
20     public void startElement(String uri, String localName, String qName,
21         Attributes attributes) throws SAXException {
22         sb.append("<"+qName);
23         if(attributes !=null){
24             for (int i = 0; i < attributes.getLength(); i++) {
25                 //得到屬性名稱
26                 String attrName=attributes.getQName(i);
27                 String attrValue=attributes.getValue(i);
28                 sb.append(" "+attrName+"=\""+attrValue+"\"");
29             }
30         }
31         sb.append(">");
32     }
33     //文字內容
34     @Override
35     public void characters(char[] ch, int start, int length)
36             throws SAXException {
37         String content=new String(ch,start,length);//獲取標籤中的文字內容
38         sb.append(content);
39     }
40     //結束標籤
41     @Override
42     public void endElement(String uri, String localName, String qName)
43             throws SAXException {
44         sb.append("</"+qName+">");
45     }
46 }

contact.xml檔案

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <contactList>
 3     <contact id="001" sex="男">
 4         <name>張三</name>
 5         <age>18</age>
 6         <phone>15779593710</phone>
 7         <email>[email protected]</email>
 8         <qq>872855221</qq>
 9     </contact>
10     <contact id="002">
11         <name>李四</name>
12         <age>20</age>
13         <phone>1314580</phone>
14         <email>[email protected]</email>
15         <qq>832144529</qq>
16     </contact>
17 </contactList>

結果圖

附錄2

 1 package com.shore.code;
 2 
 3 import java.io.File;
 4 import java.util.List;
 5 
 6 import javax.xml.parsers.SAXParser;
 7 import javax.xml.parsers.SAXParserFactory;
 8 
 9 import org.xml.sax.SAXException;
10 
11 /**
12  * @author DSHORE / 2018-9-6
13  *
14  */
15 //需求:儲存所有聯絡人資訊
16 public class Demo7 {
17     public static void main(String[] args) throws Exception, SAXException {
18         SAXParser parser=SAXParserFactory.newInstance().newSAXParser();
19         MyDefaultHander3 hander=new MyDefaultHander3();
20         parser.parse(new File("./src/contact.xml"),hander);
21         List<Contact> list=hander.getList();
22                     
23         for (Contact contact : list) {
24             System.out.println(contact);
25         }
26     }
27 }

MyDefaultHander3.java檔案

 1 package com.shore.code;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 import org.xml.sax.Attributes;
 7 import org.xml.sax.SAXException;
 8 import org.xml.sax.helpers.DefaultHandler;
 9 
10 /**
11  * @author DSHORE / 2018-9-6
12  *
13  */
14 public class MyDefaultHander3 extends DefaultHandler{
15     //儲存所有聯絡人物件
16     private List<Contact> list=new ArrayList<Contact>();
17     private Contact contact;
18     private String curTag;
19     
20     public List<Contact> getList(){
21         return list;//把設定進去集合裡的值 返回給呼叫者
22     }
23     //讀到開始標籤 呼叫
24     @Override
25     public void startElement(String uri, String localName, String qName,
26         Attributes attributes) throws SAXException {
27         curTag=qName;
28         //System.out.println(curTag);//返回值:xml檔案中的所有標籤名
29         if("contact".equals(qName)){
30             contact=new Contact();    
31             //設定id
32             contact.setId(attributes.getValue("id"));
33         }    
34     }
35     //讀到文字內容時 呼叫
36     @Override
37     public void characters(char[] ch, int start, int length)
38             throws SAXException {
39         //當前文字內容
40         String content=new String(ch,start, length);
41         if("name".equals(curTag)){
42             contact.setName(content);
43         }
44         if("age".equals(curTag)){
45             contact.setAge(content);
46         }
47         if("phone".equals(curTag)){
48             contact.setPhone(content);
49         }
50         if("email".equals(curTag)){
51             contact.setEmail(content);
52         }
53         if("qq".equals(curTag)){
54             contact.setQq(content);
55         }
56     }
57     //讀到結束標籤時 呼叫
58     @Override
59     public void endElement(String uri, String localName, String qName)
60             throws SAXException {
61         curTag = null;//作用:防止xml檔案 標籤中的值被設定兩次(被覆蓋)。
62         /* 解析:如果不要這句程式碼,輸出結果除了id有值,其他標籤全部沒值。
63          *       比如contact.xml檔案的name標籤,讀到該標籤時,curTag=name,被設定進去的值是“張三”,因為<name>張三</name>標籤後面的空白處也是文字內容;
64          *       (同一行)所以還會往後解析,這時curTag還是等於name,所以空白也被設定進去了(空白文字替換掉了張三);所以name、age、phone、email、qq等標籤 全部沒值。
65          **/
66         if("contact".equals(qName)){
67             list.add(contact);
68         }
69     }
70 }

contact.xml檔案用的是 和附錄1一樣

contact.java檔案

 1 package com.shore.code;
 2 
 3 /**
 4  * @author DSHORE / 2018-9-6
 5  *
 6  */
 7 public class Contact {
 8     private String id;
 9     private String name;
10     private String age;
11     private String phone;
12     private String email;
13     private String qq;
14     
15     public String getId() {
16         return id;
17     }
18     public void setId(String id) {
19         this.id = id;
20     }
21     public String getName() {
22         return name;
23     }
24     public void setName(String name) {
25         this.name = name;
26     }
27     public String getAge() {
28         return age;
29     }
30     public void setAge(String age) {
31         this.age = age;
32     }
33     public String getPhone() {
34         return phone;
35     }
36     public void setPhone(String phone) {
37         this.phone = phone;
38     }
39     public String getEmail() {
40         return email;
41     }
42     public void setEmail(String email) {
43         this.email = email;
44     }
45     public String getQq() {
46         return qq;
47     }
48     public void setQq(String qq) {
49         this.qq = qq;
50     }
51     @Override
52     public String toString() {
53         return "Contact [id=" + id + ", name=" + name + ", age=" + age
54                 + ", phone=" + phone + ", email=" + email + ", qq=" + qq + "]";
55     }
56 }

結果圖

相關推薦

java基礎74 XML解析SAX解析相關知識點網頁知識

1、SAX解析工具     SAX解析工具:是Sun公司提供的,內建JDK中。org.xml.sax.*         2、SAX解析的核心API SAXParser類:用於讀取和解析xml檔案物件    parse(File f, DefaultHandler dh)方法----->解析xml檔案

java基礎71 XML解析的【DOM和SAX解析工具】相關知識點網頁知識

本文知識點(目錄):本文下面的“例項及附錄”全是DOM解析的相關內容 1、xml解析的含義     xml檔案除了給開發者看,更多情況下是使用程式讀取xml檔案中的內容 2、XML的解析方式     DOM解析    SAX解析 3、xml的解析工具 3.1、DOM解析工具     1.JAXP(orac

java基礎80 JSP基礎知識點網頁知識

1、jsp的引入     Servlet的作用:用java語言開發動態資源技術!!!    Jsp的作用:用java語言(+html語言)開發的動態資源技術!!!     Jsp就是servlet 問題:為什麼jsp就是servlet? 因為:Jsp翻譯成java檔案 public final class

java基礎65 JavaScript網頁知識

str order 幫助 ron target logs .com font tro 1、待續 待續 原創作者:DSHORE 作者主頁:http://www.cnblogs.com/dshore123/ 原文出自:https://www.cnbl

java基礎70 負責靜態的網頁的制作語言XML網頁知識

引號 自定義 交互 ref 特殊 通訊 key alt 如果 HTML:負責網頁結構的CSS:負責網頁的樣式(美觀)JavaScript:負責客戶(瀏覽器)端與用戶進行交互 1、HTML語言的特點 1.由標簽組成 2.語法結構松散 3.大小寫不區分

java基礎74 待續2網頁知識

tps str log strong body cnblogs logs blank targe 1、待續 待續 原創作者:DSHORE 作者主頁:http://www.cnblogs.com/dshore123/ 原文出自:

java基礎73 dom4j修改xml裡面的內容網頁知識

1 package com.shore.code; 2 3 import java.io.File; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 7 import org.dom4j.A

java基礎73 待續網頁知識

bsp 說明 http col tro font -s .cn java基礎 1、待續 待續 原創作者:DSHORE 作者主頁:http://www.cnblogs.com/dshore123/ 原文出自:https://www.cnbl

java基礎75 待續2網頁知識

謝謝 logs borde 幫助 www. targe 轉載 .com http 1、待續 待續 原創作者:DSHORE 作者主頁:http://www.cnblogs.com/dshore123/ 原文出自:https://ww

java基礎81 jsp的內置對象網頁知識

什麽是 basepath 緬甸 exceptio 中文 bili sun公司 ESS pwrite 1、什麽是內置對象? 在jsp開發中,會頻繁使用到一些對象,如:HttpSession,ServletContext,HttpServletRequest。 如

java基礎81 jsp的內建物件網頁知識

1、什麼是內建物件?   在jsp開發中,會頻繁使用到一些物件,如:HttpSession,ServletContext,HttpServletRequest。      如果每次使用這些物件時,都要去建立物件 顯示非常麻煩。所有sun公司就設計jsp時,在jsp頁面載入完畢後會自動幫助開發者建立好這些物件,

java基礎75 xpth技術網頁知識

1、xpth技術 1.1、xpath的作用     主要用於快速獲取所需的節點物件。     list<Node> selectNodes("xpath");  查詢多個節點物件                     selectSingleNode("xpath");  查詢一個節點物件 1.

Java基礎83 待續網頁知識

java 主頁 idt htm href www 轉載 -s width 1、待續 待續 原創作者:DSHORE 作者主頁:http://www.cnblogs.com/dshore123/ 原文出自:https://www.cnblogs.

Java基礎XML(SAX解析)

程式碼如下: package com.briup.SAXXML; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java

java和androidsax解析xml

學習安卓sax解析xml時,想用java寫一個解析某個xml檔案的Handler,程式碼如下: import org.xml.sax.*; import org.xml.sax.helpers.DefaultHandler; import javax.xml.parser

Java學習總結21——XML文檔解析:DOM解析SAX解析

Oz 學習總結 AR javax exce 天氣 efault ray XP 一.XML簡介1.可擴展性標記語言(eXtensible Markup Language)2.XML用於描述數據3.應用場合:(1)持久化存儲數據(2)數據交換(3)數據配置4.XML語法(1)文

Java基礎XML(DOM解析和建立)

程式碼如下: package com.briup.DOMXML; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java

java解析XML之DOM解析SAX解析包含CDATA的問題

  Dom解析功能強大,可增刪改查,操作時會將XML文件讀到記憶體,因此適用於小文件;   SAX解析是從頭到尾逐行逐個元素解析,修改較為不便,但適用於只讀的大文件;SAX採用事件驅動的方式解析XML。如同在電影院看電影一樣,從頭到尾看一遍,不能回退(Dom可

【文件處理】xml 文件 SAX解析

student 內容 訪問 sets display xtend style hide news SAX的全稱是Simple APIs for XML,也即XML簡單應用程序接口。 與DOM不同,SAX提供的訪問模式是一種順序模式,這是一種快速讀寫XML數據的方式。 當使用

XML 解析---dom解析sax解析

靜態 open 轉換器 tno 抽象 imp 高速 default 內容 眼下XML解析的方法主要用兩種: 1、dom解析:(Document Object Model。即文檔對象模型)是W3C組織推薦的解析XML的一種方式。 使用dom解析XML文檔,該解析器會先