posts - 33,comments - 21,trackbacks - 0
          轉(zhuǎn)貼自賽迪網(wǎng)(http://tech.ccidnet.com/art/294/20021120/31320_4.html)


          DOM 由W3C 制定,目標(biāo)是提供一個(gè)可以通用于各種程序語(yǔ)言、操作系統(tǒng)和應(yīng)用程序的API,所以DOM 具有極高的兼容性,不論CORBA、COM、Java、C++等都可以使用同樣的DOM 接口。也因?yàn)檫@種跨平臺(tái)的需求,DOM 在定義時(shí)就采用了CORBA 標(biāo)準(zhǔn),因此它可以為各個(gè)語(yǔ)言提供完全相同的接口。

          DOM 是文檔對(duì)象模型。XML 將數(shù)據(jù)組織為一棵樹(shù),DOM 就是對(duì)這棵樹(shù)的一個(gè)對(duì)象描述。通俗地說(shuō),就是通過(guò)解析XML 文檔,為XML 文檔在邏輯上建立一個(gè)樹(shù)模型,樹(shù)的節(jié)點(diǎn)是一個(gè)個(gè)對(duì)象。我們通過(guò)存取這些對(duì)象就能夠存取XML 文檔的內(nèi)容。

          DOM 的基本對(duì)象有5個(gè),分別是Document、Node、NodeList、Element 和 Attr。

          下面舉一個(gè)通過(guò)一個(gè)圖形界面觀察DOM 對(duì)象的例子。在Java 的標(biāo)準(zhǔn)包里有JTree 可以來(lái)表達(dá)樹(shù)的概念,結(jié)合Java 的窗口JFrame ,完成一個(gè)類(lèi)似于IE瀏覽器功能的DOM 對(duì)象查看器。

          DOMTreeView.java 的源程序代碼詳見(jiàn)http://linux.ccidnet.com的期刊瀏覽第11期。

          2.SAX 編程

          SAX(Simple Application interface for XML)是一個(gè)為基于事件XML解析器定義的、可以免費(fèi)獲得的、與平臺(tái)和語(yǔ)言無(wú)關(guān)的API,它允許程序和腳本動(dòng)態(tài)的訪問(wèn)和更新文檔內(nèi)容、結(jié)構(gòu)和風(fēng)格。所以,它作為一個(gè)中間件層用來(lái)把XML文檔中的數(shù)據(jù)解釋成相應(yīng)的Java事件。SAX這個(gè)接口規(guī)范是XML分析器和處理器提供的、較XML更底層的接口,它能提供應(yīng)用以較大的靈活性。SAX是一種事件驅(qū)動(dòng)的接口。它的基本原理是,由接口的用戶(hù)提供符合定義的處理器,XML分析時(shí)遇到特定的事件,就去調(diào)用處理器中特定事件的處理函數(shù)。一般SAX都是Java的接口,但C++也可以用SAX接口,只是C++的分析器比較少。SAX需要用戶(hù)提供以下三個(gè)處理器類(lèi)的實(shí)現(xiàn):

          (1)DocumentHandlerXML:文件事件的處理器;

          (2)DTDHandler:DTD中事件的處理器;

          (3)ErrorHandler:出錯(cuò)處理器。

          下面舉一個(gè)例子,它實(shí)現(xiàn)了許多處理XML 文件時(shí)重要事件的ContentHandler 接口,并且說(shuō)明SAX 是如何分析XML 數(shù)據(jù)的。

          MySAXParser.java 的源程序代碼如下(節(jié)選部分):
          //MySAXParser.java
          import java.io.IOException;
          import java.io.FileInputStream;
          import java.util.Properties;
          import org.xml.sax.Attributes;
          import org.xml.sax.ContentHandler;
          import org.xml.sax.ErrorHandler;
          import org.xml.sax.Locator;
          import org.xml.sax.SAXException;
          import org.xml.sax.SAXParseException;
          import org.xml.sax.XMLReader;
          import org.xml.sax.helpers.XMLReaderFactory;
          /**
           * <code>SAXParser</code>可以從命令行下讀入一個(gè)XML文件并且使用SAX標(biāo)準(zhǔn)的機(jī)制來(lái)分析該文件。
           */
          public class MySAXParser{
          	/**
          	 *<p>
          	 *我們將在這里使用標(biāo)準(zhǔn)的SAX的處理機(jī)制(handler)來(lái)處理XML文件
          	 *</p>
          	 * @param uri 欲分析的XML文件的URI
          	 */
          	public void parseXML(String uri) {
          		try{
          			System.out.println("正在分析中的XML文件: " + uri + "\n");
          			XMLReader parser =
                          		XMLReaderFactory.createXMLReader(
                              		"org.apache.xerces.parsers.SAXParser");
          			//XMLReader parser = new SAXParser();
          			//注冊(cè)所設(shè)計(jì)的內(nèi)容處理器
          			parser.setContentHandler(new MyContentHandler());
          			//注冊(cè)錯(cuò)誤處理器
          			parser.setErrorHandler(new MyErrorHandler());
          			//分析文件
          			parser.parse(uri);
          		} catch(IOException ioe){
          			System.out.println("文件讀取錯(cuò)誤:"+ioe.getMessage());
          		} catch(SAXException saxe){
          			System.out.println("XML分析錯(cuò)誤: "+saxe.getMessage());
          		}
          	}
          	/**
          	 *<p>
          	 *主程序使用命令列的參數(shù)來(lái)指定所要分析的XML文件
          	 *</p>
          	 */
          	public static void main(String[] args) {
          		//如果參數(shù)數(shù)目不對(duì),則輸出使用說(shuō)明,并結(jié)束程序
          		if( args.length != 1 ){
          			System.out.println("請(qǐng)輸入欲分析的文件名: " +"java example3_1 [XML URI]");
          			System.exit(-1);
          		}
          		String uri = args[0];
          		MySAXParser myParser = new MySAXParser();
          		myParser.parseXML(uri);
          	}
          }
          /**
           *<code>ContentHandler</code>實(shí)做<code>org.xml.sax.
           *ContentHandler</code>界面,并且提供提供相關(guān)的回調(diào)方法。
           *所有和XML文件內(nèi)容有關(guān)的分析處理都是在這里解決。
           */
          class MyContentHandler implements ContentHandler {
          ..........
          ..........


          Java 與 XML ——JAXP編程應(yīng)用

          在許多方面,Java 語(yǔ)言已變成供XML 選擇的一種非常適合的編程語(yǔ)言。在JAXP(用于XML語(yǔ)法分析的Java API)中包含3個(gè)軟件包:

          1. org.w3c.dom —W3C 推薦的用于XML 標(biāo)準(zhǔn)規(guī)劃文檔對(duì)象模型的Java 工具;

          2. org.xml.sax—用于對(duì)XML 進(jìn)行語(yǔ)法分析的事件驅(qū)動(dòng)的簡(jiǎn)單API;

          3. Javax.xml.parsers —工廠化工具,允許應(yīng)用程序開(kāi)發(fā)人員獲得并配置特殊的語(yǔ)法分析器工具。

          JAXP 作為Java 應(yīng)用軟件和XML 的公共接口,用來(lái)保證Sun 、IBM 和 Micrsoft 等公司的XML 分析程序的完全兼容性。

          JAXP 是由Sun 提供的Java 的標(biāo)準(zhǔn)XML 語(yǔ)言開(kāi)發(fā)接口,目前最高版本為1.1 。JAXP1.1包含兩個(gè)部分:一個(gè)是parser 部分,位于Javax.xml.parsers 包中,負(fù)責(zé)解析XML 文檔;另一個(gè)是transform(TrAX)部分,位于Java.xml.transform 包中,負(fù)責(zé)進(jìn)行xslt 轉(zhuǎn)換工作。

          JAXP1.1 中包含3個(gè)jar 文件,分別是JAXP.jar、crimson.jar 和 xalan.jar 。JAXP.jar 提供了一系列的界面和抽象類(lèi),是開(kāi)發(fā)時(shí)使用的接口;crimson.jar 中定義了實(shí)際上使用的解析器;xalan.jar 中定義了transform 處理器。

          JAXP1.1 的解析器提供了SAX2 和 DOM2 支持,同時(shí)支持XML1.0 第二版,也支持名空間。JAXP1.1 的TrAX 部分提供了對(duì)Xslt 推薦標(biāo)準(zhǔn)1.0 版本的支持。

          下面的例子分別是使用JAXP獲得 Document Builder 建立一個(gè)DOM 對(duì)象套式文件,以及使用JAXP獲得一個(gè) SAX 語(yǔ)法分析器剖析一個(gè)XML 文件。

          (1)DOMDemo.java 源程序代碼詳見(jiàn)http://linux.ccidnet.com的期刊瀏覽第11期。

          (2)SAXDemo.java 源程序代碼詳見(jiàn)http://linux.ccidnet.com的期刊瀏覽第11期。

          有關(guān)JAXB 和 JDOM 的編程,由于篇幅有限,在此就不多說(shuō)了。

          結(jié)合的意義


          1.Java 與 XML 結(jié)合從用戶(hù)使用的應(yīng)用界面來(lái)說(shuō),XML 可以用來(lái)自定義用戶(hù)界面。如果將Java 的圖形界面Swing 技術(shù)應(yīng)用以XML 的形式來(lái)設(shè)置,就可以同時(shí)發(fā)揮Java 的“write one, use many”特性。

          2.Java 提供了Servlet 和 JSP (JavaServer Page) 。實(shí)際上 XML 和 Servlet、JSP 的相互結(jié)合,XML 可以成為Servlet或JSP的輸出輸入語(yǔ)言。XML 不僅提供具有意義的數(shù)據(jù),也提供了驗(yàn)證的方式(DTD),使得程序能輕易地獲得內(nèi)容,并能夠徹底地完成內(nèi)容數(shù)據(jù)和表達(dá)方式的分離。

          3.XML 通過(guò)Java 的JDBC與Web 數(shù)據(jù)庫(kù)相結(jié)合。以XML為基礎(chǔ)的新一代環(huán)境是直接面對(duì)Web數(shù)據(jù)的,不僅可以很好地兼容原有的Web應(yīng)用,而且可以更好地實(shí)現(xiàn)Web中的信息共享與交換。XML可看作為一種半結(jié)構(gòu)化的數(shù)據(jù)模型,很容易地將其文檔描述與關(guān)系數(shù)據(jù)庫(kù)中的屬性一一對(duì)應(yīng)起來(lái),實(shí)施精確地查詢(xún)與模型抽取。XML能增加結(jié)構(gòu)和語(yǔ)義信息,使計(jì)算機(jī)和服務(wù)器即時(shí)處理多種形式的信息。因此,運(yùn)用XML的擴(kuò)展功能不僅能從Web服務(wù)器下載大量的信息,還能大大減少網(wǎng)絡(luò)業(yè)務(wù)量。

          4.XML 與 Java 的 EJB(Enterprise Java Bean) 結(jié)合。XML 在EJB 上應(yīng)用,對(duì)于數(shù)據(jù)的溝通和EJB 的參數(shù)設(shè)置,使得EJB可以將自己所包含的數(shù)據(jù)依照J(rèn)SP 和 Servlet 要求,以 XML 的形式返回,讓JSP 和 Servlet 自行去處理和顯示這些數(shù)據(jù)有關(guān)的工作。一個(gè)EJB 可能用到的參數(shù)會(huì)很多,并且很復(fù)雜,如果可以用XML 來(lái)定義一個(gè)清楚的參數(shù)表,這樣就可以依據(jù)不同的需求來(lái)修改EJB 操作的方式,讓工作更有效率。

          5.Java 的JMS、Java/IDL(CORBA)、Java RMI 及SOAP 等各種分布式的處理,與XML 的XML-RPC 和 SOAP 都具有相似的功能。XML-RPC 和 SOAP 都是將原本是以二進(jìn)制形式傳遞的消息,用XML 來(lái)表達(dá),這樣確保了所有的應(yīng)用程序都可以讀取這些消息,整個(gè)分布式的環(huán)境更加開(kāi)放。
          posted on 2006-11-22 17:23 英明 閱讀(190) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): 編程

          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 当阳市| 原阳县| 定兴县| 历史| 洛宁县| 嘉禾县| 原阳县| 九台市| 木兰县| 黔西| 犍为县| 永丰县| 衢州市| 双鸭山市| 大同县| 新丰县| 泰来县| 龙川县| 沽源县| 诸城市| 米泉市| 沂南县| 丁青县| 怀来县| 清流县| 叙永县| 哈巴河县| 桐庐县| 德保县| 松潘县| 交城县| 南和县| 东宁县| 潮州市| 东莞市| 文昌市| 濮阳县| 万安县| 苍南县| 高雄县| 金沙县|