XML學習筆記(一)之DOM及SAX方式解析XML原理
1.XML
XML 指可擴展標記語言(eXtensible Markup Language)。XML 被設計用來傳輸和存儲數據。
(1)XML 文檔形成了一種樹結構,它從"根部"開始,然后擴展到"枝葉"。
示例:
<bookstore>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
</bookstore>
在程序中常要對XML增加、修改、刪除和檢索,這就需要對XML進行解析
2.1 DOM解析
DOM (文檔對象模型) 解析器讀入整個文檔,然后構建一個駐留內存的樹結構,然后通過節點以及節點之間的關系來解析xml文件,操作這個樹的結構。
- 優點:整個文檔樹在內存中,便于操作,支持刪除、修改、重新排列等多種功能;
- 缺點:將整個文檔調入內存(包括無用的節點),浪費時間和空間
- 使用場合:一旦解析了文檔還需多次訪問這些數據,但硬件資源充足(內存、CPU).
下面結合這個xml文件來進行dom解析。
step1:先在d盤準備一個students.xml文檔
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student sn="01">
<name>張三</name>
<age>18</age>
</student>
<student sn="02">
<name>李四</name>
<age>54</age>
</student>
</students>
step2:
package com.dom;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
public class Demo05 {
public static void main(String[] args)throws Exception {
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
DocumentBuilder db=dbf.newDocumentBuilder();
Document doc=db.parse(new File("d:\\students.xml"));
//增加一個學生節點
Element student=doc.createElement("student");
student.setAttribute("sn", "03");
Element name=doc.createElement("name");
Element age=doc.createElement("age");
Text nametxt=doc.createTextNode("小明");
Text agetxt=doc.createTextNode("25");
name.appendChild(nametxt);
age.appendChild(agetxt);
student.appendChild(name);
student.appendChild(age);
doc.getDocumentElement().appendChild(student);
//查找名為name的節點,并輸出它的節點值
NodeList names=doc.getElementsByTagName("name");
if(null!=names&&names.getLength()>0)
{
for(int i=0;i<names.getLength();i++)
{
Element element=(Element)names.item(i);
System.out.println(element.getFirstChild().getNodeValue());
}
}
}
}
輸出結果:
張三
李四
小明
2.2 SAX解析
SAX是一種基于事件驅動的API。利用SAX解析XML文檔,涉及到兩個部分,解析器和事件處理器,解析器負責讀取XML文檔,并向事件處理器發送事件,如元素的開始和元素的結束事件,而事件處理器則負責對事件做出響應,對傳遞XML數據進行處理。
- 優點:不用事先調入整個文檔,占用資源少,SAX解析器代碼比DOM解析器代碼小。
- 缺點:
- 不是持久的,事件過后,若沒保存數據,那么數據就丟了;
- 無狀態性,只解析當前元素,無法訪問之前的內容
- 從事件中只能得到文本,但不知道該文本屬于哪個元素;
- 使用場合:只需XML文檔的少量內容,很少回頭訪問;機器內存少;
package com.xzy;
import java.io.File;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.DefaultHandler;
public class Demo01 {
public static void main(String[] args) throws Exception
{
SAXParserFactory spf=SAXParserFactory.newInstance();
SAXParser parser=spf.newSAXParser();
File f=new File("d:\\students.xml");//要讀取的xml文檔
parser.parse(f, new MyHandler());
}
//自定義事件處理器
public static class MyHandler extends DefaultHandler
{
@Override
public void startDocument() throws SAXException {
System.out.println("開始解析文檔.......................................");
}
@Override
public void endDocument() throws SAXException {
System.out.println("結束解析文檔.......................................");
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
System.out.println("結束元素:"+qName);
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
System.out.println("文本:"+new String(ch,start,length));
}
@Override
public void error(SAXParseException e) throws SAXException {
System.out.println("出錯了。。。。。。");
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes)
throws SAXException {
System.out.println("開始元素:"+qName);
}
}
}
輸出結果:
開始解析文檔.......................................
開始元素:students
文本:
開始元素:student
文本:
開始元素:name
文本:張三
結束元素:name
文本:
開始元素:age
文本:18
結束元素:age
文本:
結束元素:student
文本:
開始元素:student
文本:
開始元素:name
文本:李四
結束元素:name
文本:
開始元素:age
文本:54
結束元素:age
文本:
結束元素:student
文本:
結束元素:students
結束解析文檔.......................................
智能推薦
Android開發:XML簡介及DOM、SAX、PULL解析對比
目錄 目錄 定義 XML(extensible Markup Language) ,是一種數據標記語言 & 傳輸格式 作用 對數據進行標記(結構化數據) 對數據進行存儲 對數據進行傳輸 與html的區別:html用于顯示信息;xml用于存儲&傳輸信息 XML特點 標簽可進行自定義 XML允許作者定義自己的標簽和文檔結構 自我描述性 XML文檔實例 僅僅是一個純文本,有文本處理能力的...
xml文件--SAX方式解析xml文件
SAX介紹 SAX的全稱是Simple APIs for XML,也即XML簡單應用程序接口。 與DOM不同,SAX提供的訪問模式是一種順序模式,這是一種快速讀寫XML數據的方式。 當使用SAX分析器對XML文檔進行分析時,會觸發一系列事件,并**相應的事件處理函數,應用程序通過這些事件處理函數實現對XML文檔的訪問,因而SAX接口也被稱作事件驅動接口。 局限性: 1. SAX...
Android XML DOM解析SAX解析
聲明:內容大部分參考自網友博客。個人只是做了小小的總結 我個人覺得可以用MVC模式去看待解析xml文件的實現: 下面是具體實現: 首先編寫一個xml的數據文件存放在res/raw文件目錄下: 1.編寫模型代碼: 2.視圖編輯: 3.控制器代碼: 下面是具體實現: 首先編寫一個xml的數據文件存放在res/raw文件目錄下: 1.編寫模型代碼: 2.視圖編輯: 3.控制器代碼:...
XML解析(一),SAX解析XML
轉載自 XML解析(一),SAX解析XML 一、概述 SAX,全稱Simple API for XML,是一種以事件驅動的XMl API,是XML解析的一種新的替代方法,解析XML常用的還有DOM解析,PULL解析(Android特有),SAX與DOM不同的是它邊掃描邊解析,自頂向下依次解析,由于邊掃描邊解析,所以它解析XML具有速度快,占用內存少的優點,對于An...
猜你喜歡
Java中xml解析 SAX、PULL、DOM
目錄 一,什么是XML: 二,XML的解析 一,什么是XML: 定義:XML指的是可擴展標記語言,主要用來傳輸和存儲數據。 XML主要語法規則: XML標簽需要用戶自定義 XML標簽使用時要關閉<標簽名> </標簽名>成對存在 XML標簽對區分大小寫 XML標簽必須正確的嵌套 XML文檔有且只有一個根元素 XML的屬性值要加引號 XML中的空格換行符等會被當做...
XML解析___使用Dom or使用Sax
xml解析方式分為兩種,dom和sax dom:(Document Object Model,即對文檔對象模型)是W3C組織推薦的處理XML的一種方式 Sax:(Simple API for XML)不是官方標準,但它是xml社區事實上的標準,幾乎所有的xml解析器都支持它。 XML解析開發包 Jaxp、Jdom、dom4J 使用DOM解析XML介紹 DOM...
XML之SAX解析XML實例
--------------------------------------------XML之SAX解析XML------------------------------------------ 一,前言 SAX是針對DOM解析XML內存占用大,查找速度慢的缺點而出現的解決方案。SAX解析器對XML文檔解析會從XML文檔開始位置起進行解析,同時根據已經定義好的事件處理器,來解決當前所解析的部分(...
虛擬機centos配置網絡,固定ip地址
執行 ifconfig,查看網絡是沒有ip地址的 一、首先將虛擬機的網絡配置設置為橋接模式 二、查看虛擬網絡配置 三、進入到系統控制臺中 配置如圖所示:...
中移OneNET 云平臺 >>> 一塊ESP8266 的WiFi 定位之旅
前言 WiFi 定位功能是OneNET 繼基站定位之后最新推出的一項定位服務。(編稿時仍處于灰度測試階段) 然后我有幸參與了WiFi 定位功能的灰度測試,測試成功,在此記錄一下 開始 1)為設備開啟WiFi 定位功能 WiFi 定位功能門戶(編稿時處于半開放狀態,官網不能查詢到,直接點擊下方鏈接進入): https://open.iot.10086.cn/develop/lbs/#/wifi/wi...