posts - 21,  comments - 6,  trackbacks - 0
          以Sun公司的JAXP為例來看看其中和DOM相關的包:

          DOM包結構

             org.w3c.com:定義了DOM的接口。這是w3c所指制定的DOM規范,因為DOM規范是與語言無關的,因而其中只是定義了接口,而沒有實現任何地類。任何具體的DOM實現需要有其它的類庫給出。

             javax.xml.parser:定義了DocumentBuilderFactory類DocumentBuilder類。編程時用DocumentBuilderFactory來生成一個具體的和具體的類庫相聯系的DocumentBuilder類的實例,然后再由這個DocumentBuilder對象來生成一個Document實例。Document對象中就包含了DOM的樹模型結構,是DOM模型的根。同SAXParserFactory一樣,具體的DocumentBuilder對象的建立,取決于一個環境變量javax.xml.parsers.DocumentBuilderFactory的值,同樣的,也可以直接把類名傳遞給DocumentBuilderFactory來建立一個DocumentBuilder。

             com.sun.xml.tree:Sun的Java XML的DOM實現,他對標準的DOM提供了一些擴展,其中大部分的東西并不是DOM標準。包括了XMLDocument,ElementNode, XMLDocumentBuilder和TreeWalker等類。XMLDocument類實現了DOM的Document界面,它同樣也提供了靜態的工廠方法來建立一個Document對象。ElementNode類代表了在一個DOM樹中的每一個節點元素,并且它經常被繼承,來實現一些自定的功能。 而XMLDocumentBuilder實際上是一個DocumentHandler類型的類,也就是說,它接受一個SAX解析器傳遞過來的事件,然后根據這些事件來在內存中建立一個DOM模型。

          DOM處理過程

             DOM的處理過程相對SAX而言要簡單些,先用DocumentBuilderFactory的靜態方法newInstance()建立一個DocumentBuilderFactory的實例,然后用它的newDocumentBuilder()方法建立一個DocumentBuilder。然后可以用DocumentBuilder的parser()方法來解析一個XML文檔并建立DOM模型。在JAXP中還提供了更為方便的功能擴展,就是使用XMLDocument。你可以為一個SAX解析器注冊一個事件處理器XMLDocumentBuilder,在解析過后,可以調用XMLDocumentBuilder的getDocument()方法就可以把一個外在地XML文檔轉換成一個內存中的DOM樹了,并生成一個Document(XMLDocument)對象,后面的工作,就是調用XMLDocument對象和ElementNode對象的各個方法來對DOM樹進行操作了。最后,還可以調用XMLDocument的wirte()方法來把DOM樹輸出為XML文件。因為在標準的DOM模型中并沒有提供與write()相類似的方法,所以要處理輸出的話,用XMLDocument會更方便些。

          實例DOM

             下面我們可以來看看例子了。

          首先當然是import語句:


          import javax.xml.parsers.DocumentBuilderFactory; 

          import javax.xml.parsers.FactoryConfigurationError; 

          import javax.xml.parsers.ParserConfigurationException;

          import javax.xml.parsers.DocumentBuilder;
             為了能給你更多的印象,我詳細內出了所有的類,實際上你只需要一句就可以了:

          import javax.xml.parsers.*;

          你還需要的是W3C對DOM和DOM例外的定義:

          import org.w3c.dom.Document; import org.w3c.dom.DOMException;
          還有一些其他的用來進行例外和I/O處理的類:


          import org.xml.sax.SAXException; 

          import org.xml.sax.SAXParseException;

          import java.io.File;

          import java.io.IOException;



          因為要輸出XML文檔,所以還要引入XMLDocument:



          import com.sun.xml.tree.XmlDocument; 

          public class DomEcho{



          在程序邏輯中,因為要處理DOM模型,所以當然首先應該申明一個Document對象:



          static Document document;

          public static void main (String argv [])

          {

          if (argv.length != 1) {

                      System.err.println ("Usage: java DomEcho filename";

                      System.exit (1);

                  }
             用DocumentBuilderFactory類的靜態方法newInstance()來創建一個工廠實例,之所以稱為工廠,是由于再這兒應用到了設計模式(Design Pattern)中的工廠模式,實際上在Java類庫中設計模式的范例隨處可見,如果能夠對設計模式有一些了解,就會很容易為Java龐雜的類庫理出一條條脈絡分明的經線。
                  DocumentBuilderFactory factory =

                     DocumentBuilderFactory.newInstance();

                  try {

                     DocumentBuilder builder = factory.newDocumentBuilder();

                     document = builder.parse( new File(argv[0]) );
             前面說過,DOM標準模型中并沒有定義輸出的接口,因而如果需要進行文檔輸出的話,就需要用到JAXP的擴展,使用到XmlDocument。這兒有一個較為簡便的方法,就是用強制類型轉換,把一個Document類轉換成XmlDocument,然后,就可以使用XmlDocument的write()方法了:
                     XmlDocument xdoc = (XmlDocument) document;

                     xdoc.write (System.out);
             在后面的都是例外的處理了,在DOM中雖然有定義了DOMException,但是DOMException只是用在遍歷和操作DOM樹時引發的例外。在解析文檔和初始化解析器時所引發的例外,還是借助于SAX中的例外處理方法,以使程序上具有一致性:

                  } catch (SAXParseException spe) {

                       // 處理解析過程中生成的例外

                     System.out.println ("\n** Parsing error"

                        + ", line " + spe.getLineNumber ()

                        + ", uri " + spe.getSystemId ());

                     System.out.println("   " + spe.getMessage() );

                     Exception  x = spe;

                     if (spe.getException() != null)

                         x = spe.getException();

                     x.printStackTrace();

                  } catch (SAXException sxe) {

                     // 處理一般的程序例外或者解析器初始化時引發的例外

                     Exception  x = sxe;

                     if (sxe.getException() != null)

                         x = sxe.getException();

                     x.printStackTrace();

                  } catch (IOException ioe) {

                     // IO例外

                     ioe.printStackTrace();

                  }

              }

             這而對DOM講的比較簡略,但是基本的程序結構我們已經可以從中看出來了。
          posted on 2006-09-22 15:14 Warren.Wu 閱讀(614) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 塔河县| 龙里县| 奎屯市| 财经| 浦县| 彭州市| 霍州市| 三河市| 蒙阴县| 锦州市| 阿尔山市| 马边| 涿鹿县| 静宁县| 宁河县| 类乌齐县| 珠海市| 汾阳市| 余庆县| 惠来县| 页游| 临澧县| 威宁| 新绛县| 福清市| 桑日县| 南涧| 香港 | 肇东市| 乌苏市| 崇阳县| 丽江市| 阜城县| 石楼县| 富裕县| 鱼台县| 蒙山县| 三门峡市| 新野县| 汤原县| 嘉义县|