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和android中sax解析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文檔,該解析器會先