隨筆-18  評論-20  文章-0  trackbacks-0
            2007年8月17日
               摘要:   閱讀全文
          posted @ 2007-08-25 13:26 JavaPoint 閱讀(1090) | 評論 (0)編輯 收藏
               摘要: ArcGis server,如何在Task中實現(xiàn) 下拉列表和 checkbox 和 radiobutton.
          ArcGis server教程系列  閱讀全文
          posted @ 2007-08-22 17:35 JavaPoint 閱讀(1847) | 評論 (2)編輯 收藏
               摘要:   閱讀全文
          posted @ 2007-08-18 15:46 JavaPoint 閱讀(3213) | 評論 (1)編輯 收藏
               摘要:   閱讀全文
          posted @ 2007-08-18 10:29 JavaPoint 閱讀(1716) | 評論 (1)編輯 收藏
               摘要:   閱讀全文
          posted @ 2007-08-18 10:23 JavaPoint 閱讀(623) | 評論 (0)編輯 收藏
               摘要:   閱讀全文
          posted @ 2007-08-17 09:44 JavaPoint 閱讀(744) | 評論 (0)編輯 收藏

          Java有多種方法可以分析XML文檔,你可以選擇現(xiàn)在已經(jīng)成熟的標(biāo)準(zhǔn)技術(shù),比如DOM和SAX,或者你可以選擇專用于處理XML的Java API (Java API for XML Processing,JAXP)。

          JAXP是一種專門提供XML文檔解析的Java接口,下面我們就來研究一下如何使用Apache Xerces-2 解析器來實現(xiàn)JAXP。

          工廠模式

          JAXP提供了一種DOM及SAX方式的解析器來處理XML文檔,也就是工廠模式。你選擇不同的工廠類就會有不同的處理方法。工廠類實際上是一個標(biāo)準(zhǔn)設(shè)計模式,你可以根據(jù)需要自行修改。

          利用JAXP,你可以使用DocumentBuilderFactory來建立自己的DocumentBuilder類,或者使用SAXParserFactory來建立自己的SAXParser類。不同之處就在于DOM解析器是將整個文檔讀入內(nèi)存并允許你以隨機(jī)方式讀取文檔,而SAX解析器是通過呼叫句柄來解釋XML文檔數(shù)據(jù)的。下面我們仔細(xì)研究一下DocumentBuilder類。

          DocumentBuilder類

          通過在DocumentBuilderFactory類中呼叫newDocumentBuilder方法,我們可以建立一個DocumentBuilder類。你可以通過呼叫newInstance方法來建立多個DocumentBuilderFactory類。

          例如,你可以這樣建立一個新的DocumentBuilderFactory類:

          DocumentBuilderFactorydbfactory = DocumentBuilderFactory.newInstance();

          一旦有了工廠類的句柄,你就可以馬上建立一個DOM解析器的實例了。下面是建立代碼:

          DocumentBuilder builder = dbfactory. newDocumentBuilder();

          這樣我們就建立了一個真正的DocumentBuilder類的實例。為了解析文檔,你必須調(diào)用DocumentBuilder類的解析方法。解析方法會返回一個Document對象,就是你要操作的XML文檔。

          Listing A實現(xiàn)了一個簡單的利用DocumentBuilderFactory和DocumentBuilder類的方法:

          Listing A:

          JAXPSample.java
          import javax.xml.parsers.*;
          import org.w3c.dom.*;

          public class JAXPSample {

            public static void main(String[] args) {
              String filename = "sample.xml";
                   
              try {
                DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                DocumentBuilder parser = factory.newDocumentBuilder();
                Document d = parser.parse(filename);
              }
              catch (Exception e) {
                System.err.println("Exception: " + e.getMessage());
              }
            
            }
          }

          DocumentBuilder類其實就是一個DOM解析器。利用JAXP的DocumentBuilder類的優(yōu)勢就在于它比其他XML解析器更輕便。

          真實的文檔

          當(dāng)通過DocumentBuilder接口使用DOM時,解析器會返回一個Document類。這個Document類很重要,因為它是完全符合W3C標(biāo)準(zhǔn)的,這意味這你可以將這個Document類和其他DOM解析器良好的結(jié)合起來。

          例如你可以通過以下代碼找回元素值:

          String getXMLValue(Document doc, String name) {     
               NodeListnlist=doc.getElementsByTagName(name);
               String value = nlist.item(0).getFirstChild().getNodeValue();
               return value;
          }

          這個方法用來尋找文檔內(nèi)與字符串一致的子節(jié)點(diǎn)。


           

          以Sun公司的JAXP為例來看看其中和DOM相關(guān)的包:

          DOM包結(jié)構(gòu)

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

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

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

          DOM處理過程

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

          實例DOM

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

          首先當(dāng)然是import語句:


             import javax.xml.parsers.DocumentBuilderFactory; 

             import javax.xml.parsers.FactoryConfigurationError; 

             import javax.xml.parsers.ParserConfigurationException;

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

          import javax.xml.parsers.*;

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

          import org.w3c.dom.Document; import org.w3c.dom.DOMException;
          還有一些其他的用來進(jìn)行例外和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模型,所以當(dāng)然首先應(yīng)該申明一個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類的靜態(tài)方法newInstance()來創(chuàng)建一個工廠實例,之所以稱為工廠,是由于再這兒應(yīng)用到了設(shè)計模式(Design Pattern)中的工廠模式,實際上在Java類庫中設(shè)計模式的范例隨處可見,如果能夠?qū)υO(shè)計模式有一些了解,就會很容易為Java龐雜的類庫理出一條條脈絡(luò)分明的經(jīng)線。
                    DocumentBuilderFactory factory =

                        DocumentBuilderFactory.newInstance();

                     try {

                        DocumentBuilder builder = factory.newDocumentBuilder();

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

                        xdoc.write (System.out);
             在后面的都是例外的處理了,在DOM中雖然有定義了DOMException,但是DOMException只是用在遍歷和操作DOM樹時引發(fā)的例外。在解析文檔和初始化解析器時所引發(fā)的例外,還是借助于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) {

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

                        Exception  x = sxe;

                        if (sxe.getException() != null)

                            x = sxe.getException();

                        x.printStackTrace();

                     } catch (IOException ioe) {

                        // IO例外

                        ioe.printStackTrace();

                     }

                 }

             這而對DOM講的比較簡略,但是基本的程序結(jié)構(gòu)我們已經(jīng)可以從中看出來了。

           DOM jdk幫助

          posted @ 2007-08-17 09:36 JavaPoint 閱讀(1156) | 評論 (0)編輯 收藏
               摘要:   閱讀全文
          posted @ 2007-08-17 08:28 JavaPoint 閱讀(1346) | 評論 (0)編輯 收藏
          主站蜘蛛池模板: 罗田县| 凤阳县| 南投市| 都匀市| 秭归县| 禹城市| 分宜县| 临邑县| 金堂县| 丹凤县| 兴安盟| 康定县| 桓台县| 涡阳县| 莲花县| 遂昌县| 横峰县| 海盐县| 瑞昌市| 宁河县| 高台县| 镇远县| 罗山县| 南安市| 峨山| 太康县| 普洱| 鱼台县| 巴里| 中江县| 乌审旗| 晴隆县| 怀柔区| 平度市| 巩留县| 天津市| 杭锦旗| 安国市| 商都县| 游戏| 客服|