xml解析
xml簡介
XML(eXtended Markup Language,可擴展標記性語言),xml可以對文檔和數據進行結構化處理,從而能夠在部門、客戶和供應商之間進行交換,實現動態內容生成,企業集成和應用開發。xml可以使我們能夠更準確的搜索,更方便的傳送軟件組件,更好的描述一些事物。例如電子商務交易等。它的主要特點:它被設計用來傳輸和存儲數據;被設計用來顯示數據。它們都是[標準通用標記語言]的子集。
xml解析
在XML文件中由于更多的是描述信息的內容,所以在得到一個XML文檔后用該利用程序按照其中元素的定義名稱取出對應的內容,這樣的操作就稱為XML解析。在XML解析中W3C定義了SAX和DOM兩種解析方式,這兩種解析方式的程序操作如下:
XML解析操作
可以看出,應用程序不是直接對XML文檔進行操作的,而是首先由XML分析器對XML文檔進行分析,然后應用程序通過XML分析器所提供的DOM接口或SAX接口對分析結構進行操作,從而間接地實現了對XML文檔的訪問。
Dom解析
在應用程序中,基于DOM (Document Object Model,文檔對象模型)的XML分析器將一個XML文檔轉換成一個對象模型的集合(通常稱為DOM樹),應用程勛正是通過對這個對象模型的操作,來實現對XML文檔數據的操作。通過DOM接口,應用程序可以在任何時候訪問XML文檔中的任何一部分數據,因此,這種這種利用DOM接口的機制也被稱作隨機訪問機制。由于DOM分析器把整個XML文檔轉化成DOM樹放在了內存中,因此,當文檔比較大或者結構比較復雜時,對內存的需求就比較高,而且對于結構復雜的樹的遍歷也是一項耗時的操作。DOM操作會在內存中將所有的XML文件變為DOM樹。
在DOM解析中有以下4個核心的操作接口:
Document:此接口代表了整個XML文檔,表示整個DOM樹的根,提供了對文檔中的數據進行訪問和操作的入口,通過Document節點可以訪問XML文件中所有的元素內容。
Document接口的常用方法
Node:DOM操作的核心接口中有很大一部分是從Node接口繼承過來的。例如Document、Element、Attri等接口。在DOM樹中,每一個Node接口代表了DOM樹中的一個節點。
Node接口的常用方法
NodeList:此接口表示一個節點的集合,一般用于表示有順序關系的一組節點。例如,一個節點的子節點,當文檔改變時會直接 影響到NodeList集合。
NodeList接口的常用方法
NameNodeMap:此接口表示一組節點和其唯一名稱對應的一一對應關系,主要用于屬性節點的表示。
出以上4個核心接口外,如果一個程序需要進行DOM解析讀操作,則需要按如下步驟進行:
(1)建立DocumentBuilderFactory:DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
(2)建立DocumentBuilder:DocumentBuilder builder = factory.newDocumentBuilder();
(3)建立Document:Document doc= builder.parse("要讀取的文件路徑");
(4)建立NodeList:NodeList nl = doc.getElementsByTagName("讀取節點");
(5)進行XML信息讀取。
DOM完成XML的文件輸出。此時就需要使用DOM操作中提供的各個接口(如Element接口)并手工設置各個節點的關系,同時在創建Document對象時就必須使用newDocument()方法建立一個新的DOM樹。如果現在需要將XML文件保存在硬盤上,則需要使用TransformerFactory、Transformer、DOMSource、StreamResult 4個類完成。TransformerFactory類:取得一個Transformer類的實例對象。DOMSource類:接收Document對象。StreamResult 類:指定要使用的輸出流對象(可以向文件輸出,也可以向指定的輸出流輸出)。Transformer類:通過該類完成內容的輸出。
StreamResult類的構造方法
SAX解析操作
SAX(Simple APIs for XML,操作XML的簡單接口)與DOM操作不同的是,SAX采用的是一種順序的模式進行訪問,是一種快速讀取XML數據的方式。當使用SAX 解析器進行操作時會觸發一系列的事件。
SAX主要事件
當掃描到文檔(Document)開始與結束、元素(Element)開始與結束時都會調用相關的處理方法,并由這些操作方法做出相應的操作,直到整個文檔掃描結束。如果在開發中想要使用SAX解析,則首先應該編寫一個SAX解析器,再直接定義一個類,并使該類繼承自DefaultHandler類,同時覆寫上述的表中的方法即可。
建立完SAX解析器后,還需要建立SAXParserFactory和SAXParser對象,之后通過SAXPaeser的parse()方法指定要解析的XML文件和指定的SAX解析器。
使用SAX解析器
package com.sax.demo;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
public class SaxTest { public static void main(String[] args) throws Exception {
//(1)建立SAX解析工廠
SAXParserFactory factory = SAXParserFactory.newInstance();
//(2)構造解析器
SAXParser parser = factory.newSAXParser();
//(3)解析XML使用
handler parser.parse("sax_demo.xml", new XmlSax());
}}
通過上面的程序可以發現,使用SAX解析比使用DOM解析更加容易。
DOM解析與SAX解析的區別
有兩者的特點可以發現兩者的區別:DOM解析適合于對文件進行修改和隨機存取的操作,但是不適合于大型文件的操作。SAX采用部分讀取的方式,所以可以處理大型文件,而且只需要從文件中讀取特定內容。SAX解析可以由用戶自己建立自己的對象模型。
2.3、XML解析的好幫手:jdom
jdom是使用Java編寫的,用于讀、寫、操作XML的一套組件。
jdom = dom 修改文件的有點 + SAX讀取快速的優點
jdom的主要操作類
使用jdom生成XML文件
使用jdom讀取XML文件
jdom是一種常見的操作組件在實際的開發中使用非常廣泛。
2.4、解析工具:dom4j
dom4j也是一組XML操作組件包,主要用來讀寫XML文件,由于dom4j性能優異、功能強大,且具有易用性,所以現在已經被廣泛地應用開來。如,Hibernate、Spring框架中都使用了dom4j進行XML的解析操作。開發時需要引入的jar包:dom4j-1.6.1.jar、lib/jaxen-1.1-beta-6.jar
dom4j中的所用操作接口都在org.dom4j包中定義。其他包根據需要把選擇使用。
dom4j的主要接口
用dom4j生成XML文件:
用dom4j讀取XML文件:
小結
XML主要用于數據交換,而HTML則用于顯示。
Java直接提供的XML解析方式分為兩種,即DOM和SAX。這兩種解析的區別如下:
DOM解析是將所有內容讀取到內存中,并形成內存樹,如果文件量較大則無法使用,但是DOM解析可以進行文件的修改
SAX解析是采用順序的方式讀取XML文件中,不受文件大小限制,但是不允許修改。