Read Sean

          Read me, read Sean.
          posts - 508, comments - 655, trackbacks - 9, articles - 4


          至此我的XML學(xué)習(xí)筆記就截止了,大家也看到,這些都是十分基礎(chǔ)的內(nèi)容,然而我們平時(shí)很少去關(guān)心它。我的初衷是在做了N久的J2EE后回過(guò)頭來(lái)溫習(xí)一下XML的基本概念和用法,并不要求自己太深入,目的也達(dá)到了。具體的語(yǔ)法細(xì)節(jié)我想大家可以參考W3C和SUN官網(wǎng)上的資料和JavaDoc。

          希望能當(dāng)作XML的Java版快速入門來(lái)看,這些都是我們做Java的需要了解的最基本的XML常識(shí),了解這些以后對(duì)一般的XML處理工作也基本上夠了。

          謝謝大家!祝大家天天開心,日日上進(jìn)!:)

          posted @ 2005-02-24 23:03 laogao 閱讀(246) | 評(píng)論 (0)編輯 收藏


          最后我們來(lái)看看如何通過(guò)JAXP調(diào)用XSLT,同樣很簡(jiǎn)單:

          /*
           * Created on 2005-2-24
           * All rights reserved.
           *
           
          */

          package sean.home.test;

          import java.io.File;

          import javax.xml.transform.Source;
          import javax.xml.transform.Transformer;
          import javax.xml.transform.TransformerFactory;
          import javax.xml.transform.stream.StreamResult;
          import javax.xml.transform.stream.StreamSource;

          /**
           * @author Sean GAO
           * <p>
           * gaoyuxiang@gmail.com
           * </p>
           * 
           
          */

          public class XSLTest {

              
          public static void main(String[] args) throws Exception {
                  
                  TransformerFactory factory 
          = TransformerFactory.newInstance();
                  Source xmlSource 
          = new StreamSource(new File(args[0]));
                  Source xlsSource 
          = new StreamSource(new File(args[1]));
                  Transformer transformer 
          = factory.newTransformer(xlsSource);
                  transformer.transform(xmlSource, 
          new StreamResult(new File(args[3])));

              }

          }



          是不是也跟SAX、DOM的接口很像?也是通過(guò)工廠方法獲取一個(gè)Transformer實(shí)例然后提供輸入和輸出的文件路徑,用它來(lái)transform即可。

          posted @ 2005-02-24 22:55 laogao 閱讀(299) | 評(píng)論 (0)編輯 收藏


          DOM的調(diào)用方法看上去跟SAX也很類似:

          /*
           * Created on 2005-2-24
           * All rights reserved.
           *
           
          */

          package sean.home.test;

          import java.io.File;

          import javax.xml.parsers.DocumentBuilder;
          import javax.xml.parsers.DocumentBuilderFactory;

          import org.w3c.dom.Document;
          import org.w3c.dom.Node;

          /**
           * @author Sean GAO 
           * <p>
           * gaoyuxiang@gmail.com
           * </p>
           * 
           
          */

          public class DOMTest {

              
          public static void main(String[] args) throws Exception {

                  DocumentBuilderFactory factory 
          = DocumentBuilderFactory.newInstance();
                  DocumentBuilder builder 
          = factory.newDocumentBuilder();
                  Document myDocument 
          = builder.parse(new File(args[0]));
                  Node root 
          = myDocument.getDocumentElement();

                  
          // 這時(shí)我們已經(jīng)有一個(gè)完整的反映出所處理XML文檔的樹型結(jié)構(gòu),并取得了它的根節(jié)點(diǎn)
                  
                  System.
          out.println(root.getNodeName());
                  
                  
          // 
                  
              }

          }



          在這里,我們?nèi)〉昧讼胍腄OM模型,之后我們就可以對(duì)它進(jìn)行遍歷或操作了。對(duì)于org.w3c.dom.Document類型的對(duì)象,我們可以調(diào)用如下常用的方法:

          getDocumentElement()
          getElementsByTagName(String)
          getChildNodes()
          getParentNode()
          getFirstChild()
          getLastChild()
          getPreviousSibling()

          獲取到org.w3c.dom.Node對(duì)象后,我們可以:

          getAttributes()
          getNodeName()
          getNodeType()
          getNodeValue()
          getNamespaceURI()
          hasAttributes()
          hasChildNodes()

          這些方法從名稱就知道是干什么的了,對(duì)吧?我就不多解釋了。

          posted @ 2005-02-24 22:42 laogao 閱讀(271) | 評(píng)論 (0)編輯 收藏


          在前面的筆記中,我們?cè)?jīng)提到讀取XML數(shù)據(jù)的兩種截然不同的方式,SAX就是其中一種。來(lái)看一段代碼:

          /*
           * Created on 2005-2-24
           * All rights reserved.
           * 
           
          */

          package sean.home.test;

          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.helpers.DefaultHandler;

          /**
           * @author Sean GAO
           *         <p>
           *         gaoyuxiang@gmail.com
           *         </p>
           * 
           
          */

          public class Main {

              
          public static void main(String[] args) throws Exception {

                  SAXParserFactory factory 
          = SAXParserFactory.newInstance();
                  SAXParser parser 
          = factory.newSAXParser();

                  DefaultHandler myHandler 
          = new DefaultHandler() {

                      
          public void startDocument() throws SAXException {
                          System.
          out.println("XML document starts ");
                      }


                      
          public void endDocument() throws SAXException {
                          System.
          out.println("XML document ends ");
                      }


                      
          public void startElement(String uri, String localName,
                              String qualifiedName, Attributes attributes)
                              throws SAXException 
          {
                          System.
          out.println("element " + qualifiedName + "starts ");
                      }


                      
          public void endElement(String uri, String localName,
                              String qualifiedName) throws SAXException 
          {
                          System.
          out.println("element " + qualifiedName + "ends ");
                      }


                      
          public void characters(char[] ch, int start, int length) {
                          System.
          out.println(new String(ch, start, length));
                      }


                  }
          ;
                  
                  parser.parse(
          new File(args[0]), myHandler);
                  
              }

          }



          在這段代碼中,我們通過(guò)SAXParserFactory獲取一個(gè)parser,然后自定義一個(gè)Handler去處理由SAX讀取XML文件時(shí)觸發(fā)的事件,如startDocument表示文檔開始,endElement表示元素讀取結(jié)束,characters表示在元素體內(nèi)讀到內(nèi)容等等。這里我為了方便直接寫成匿名內(nèi)部類了,Exception也沒(méi)有做任何處理,這在實(shí)際中通常是不合理的。

          基本上SAX的實(shí)現(xiàn)和使用都很直截了當(dāng),就是處理一個(gè)個(gè)事件罷了。

          posted @ 2005-02-24 22:13 laogao 閱讀(282) | 評(píng)論 (0)編輯 收藏


          在前面,我們一起很粗略的過(guò)了一遍XML的基礎(chǔ)知識(shí),下面該看看如何在Java中使用功能強(qiáng)大的XML了。由于XML的廣泛應(yīng)用,許多廠商或者團(tuán)體都使用Java編寫了用于處理XML的類庫(kù),這些類庫(kù)之間并不兼容,為了給這些類庫(kù)的使用者們提供一個(gè)通用的接口,我們欣喜地看到Java中引入了JAXP,Java API for XML Processing,我們當(dāng)然也可以通過(guò)實(shí)現(xiàn)和擴(kuò)展JAXP來(lái)構(gòu)建我們自己的XML處理類。

          在我們的日常Java編程中,需要處理XML通常是如下情形:

              I- 從XML中讀取和分析數(shù)據(jù)
              II- 利用XLST將XML轉(zhuǎn)換成其他格式

          在接下來(lái)的筆記中,我們就分別來(lái)看看這兩種工作如何通過(guò)JAXP來(lái)完成。

          posted @ 2005-02-24 21:31 laogao 閱讀(297) | 評(píng)論 (0)編輯 收藏

           

          XML文檔只能以文本文件的形式存在嗎?錯(cuò)。

          常見(jiàn)的XML存儲(chǔ)形式有:

          • 文本文件
          • 關(guān)系數(shù)據(jù)庫(kù)
          • 二進(jìn)制文件
          • XML數(shù)據(jù)庫(kù)(這個(gè)是不是有點(diǎn)過(guò)分了,呵呵)

          以文本形式儲(chǔ)存XML數(shù)據(jù)當(dāng)然在很多情況下是適用的,也是我們最常看到的XML存儲(chǔ)方式,因?yàn)槲覀冊(cè)贘2EE中接觸最多的就是XML的配置文件嘛,如果不是文本的,我們改起來(lái)是不是就有點(diǎn)別扭了?只不過(guò)文本的東西每次用的時(shí)候都需要做轉(zhuǎn)換,影響到執(zhí)行的效率罷了。所以通常我們?cè)谧鲰?xiàng)目時(shí)也會(huì)用一些自動(dòng)化的工具將我們的XML在系統(tǒng)運(yùn)行或調(diào)試前做一些轉(zhuǎn)換。

          這樣看,我們還真的不能想當(dāng)然了。

          posted @ 2005-02-19 22:52 laogao 閱讀(254) | 評(píng)論 (0)編輯 收藏

           

          XML的另一個(gè)重要的應(yīng)用是數(shù)據(jù)操作。

          就數(shù)據(jù)操作而言,一個(gè)基本的概念是XPath,XPath是一種語(yǔ)言,用于通過(guò)某種文本形式的途徑表示XML文檔中的元素或者另一個(gè)XML文檔等等,基于XPath,我們才能夠在XML中相對(duì)方便的引用到相關(guān)的內(nèi)容,以致使用到XSLT這樣的東東。

          為什么會(huì)有這樣的語(yǔ)言?因?yàn)樵诤芏鄷r(shí)候XML文檔所代表的數(shù)據(jù)是相互關(guān)聯(lián)的,而并非獨(dú)立的一個(gè)一個(gè)元素和文檔,XPath等語(yǔ)言使得很多高級(jí)的操作得以簡(jiǎn)單的完成。

           

          posted @ 2005-02-19 22:45 laogao 閱讀(260) | 評(píng)論 (0)編輯 收藏

           

          由于XML的平臺(tái)和技術(shù)獨(dú)立性,它經(jīng)常被用來(lái)在不同的系統(tǒng)之間傳遞消息,基于XML這一特性而產(chǎn)生的常見(jiàn)的技術(shù)和規(guī)范包括:SOAP、Web Services、UDDI和WSDL。

          SOAP的全稱是Simple Object Access Protocol,它定義了一類XML如何創(chuàng)建、打包和傳送,可以直接通過(guò)HTTP方式同步或異步的傳遞;Web Services在很大程度上依賴于SOAP;UDDI相當(dāng)于在網(wǎng)上存儲(chǔ)和共享Web Services的位置信息,供使用者在需要調(diào)用某個(gè)Web Service時(shí)查詢;而WSDL是Web Services Dercription Language的縮寫,用于在UDDI上描述Web服務(wù)。

           

          posted @ 2005-02-19 22:33 laogao 閱讀(355) | 評(píng)論 (0)編輯 收藏

           

          作為W3C推出的拳頭標(biāo)準(zhǔn),XML的強(qiáng)大優(yōu)勢(shì)之一就是它可以方便的被轉(zhuǎn)換成其他格式的XML或者其他不同類型的文件,如PDF、HTML等都是常見(jiàn)的XML轉(zhuǎn)換的輸出格式。

          為了實(shí)現(xiàn)這個(gè)功能,我們需要利用到eXtensible Stylesheet Language for Transformations (XSLT)。XSL文件是這樣一些樣式表,它們指定如何從一個(gè)XML文件轉(zhuǎn)換出其他的格式。這個(gè)是不是多少讓你想起MFC的文檔-視圖結(jié)構(gòu)或者M(jìn)VC模式?

           

          posted @ 2005-02-19 22:20 laogao 閱讀(269) | 評(píng)論 (0)編輯 收藏

           

          為了讓XML文檔能夠被應(yīng)用程序識(shí)別和處理,必須提供一個(gè)讀取XML文檔的途徑。當(dāng)然,你也許會(huì)說(shuō),XML不就是文本文件嗎?我用java.io包不就可以讀取了?XML文件并非簡(jiǎn)單的plain text,它有自己的結(jié)構(gòu)和描述性,我們需要在基本的I/O之上更進(jìn)一步。常見(jiàn)的XML讀取有兩種不同的方式:SAX和DOM,下面我們分別來(lái)看一下:

          SAX是Simple API for XML的縮寫,顧名思義,就是處理XML的簡(jiǎn)單API,就象它的名字所暗示的那樣,SAX比DOM要簡(jiǎn)單直接得多。本質(zhì)上講,SAX是事件驅(qū)動(dòng)的,比如,當(dāng)讀取XML文件到一個(gè)標(biāo)簽的結(jié)尾時(shí),該事件被傳遞到應(yīng)用程序,應(yīng)用程序做出相應(yīng)處理,于是,應(yīng)用程序在這個(gè)時(shí)候只知道已經(jīng)讀取的那一部分內(nèi)容,而對(duì)剩下的XML數(shù)據(jù)一無(wú)所知。這正是SAX的局限,同時(shí),因?yàn)镾AX是讀一部分處理一部分,它的速度相當(dāng)快。

          DOM是Document Object Model的縮寫,文檔對(duì)象模型,這個(gè)名字聽(tīng)上去就要更抽象一些,它是一次性把整個(gè)XML文檔讀取完畢然后構(gòu)件一個(gè)完整的樹狀對(duì)象模型,于是它的速度要比SAX慢很多,但是對(duì)XML文檔整體就有一個(gè)更加完整的視圖,這在有些時(shí)候是必需的。

          通常我們使用的XML API都同時(shí)支持這兩種模式,在遇到具體問(wèn)題時(shí),我們可以根據(jù)文檔的復(fù)雜度、規(guī)模、以及我們的需求來(lái)確定到底使用哪一種模式。

           

          posted @ 2005-02-19 22:00 laogao 閱讀(608) | 評(píng)論 (0)編輯 收藏

           

          為了使得我們定義的XML文檔有意義,我們通常必須為它定義一組語(yǔ)法,如:這個(gè)文檔應(yīng)該包含那種類型的數(shù)據(jù),這種數(shù)據(jù)的層次結(jié)構(gòu)又是怎樣的,等等。這樣我們的XML文檔就可以通過(guò)專門的工具來(lái)驗(yàn)證其合法性。

          有兩種方式:I- DTD (document type definition); II- XSD (XML Schema definition),我們分別來(lái)看一下。

          DTD比較簡(jiǎn)單和直截了當(dāng),它可以很容易的定義元素和元素之間的隸屬關(guān)系,如:

          <!ELEMENT customer-repository (customer+)>

          <!ELEMENT customer (name, register-date, visits)>
          <!ATTLIST customer
            index ID #REQUIRED
          >

          <!ELEMENT name (#PCDATA)>
          <!ATTLIST name
            first-name CDATA #REQUIRED
            last-name CDATA #REQUIRED
          >

          <!ELEMENT register-date (#CDATA)>

          <!ELEMENT visits (#CDATA)>

          <!ELEMENT>用于定義元素,同時(shí)可以定義該元素是否包含其他元素,<!ATTLIST>用于定義元素的屬性,具體的語(yǔ)法可以參考http://www.w3c.org/xml/ 上的文檔。為了把我們的XML文檔和上面定義的語(yǔ)法聯(lián)系到一起,我們需要在XML中加入這樣一行代碼:

          <!DOCTYPE customer-repository SYSTEM "customer-repository.dtd">

          與DTD類似,XSD也是通過(guò)一些規(guī)則來(lái)定義一類XML的語(yǔ)法,它比DTD更加靈活,也更加強(qiáng)大,是目前W3C主推的XML驗(yàn)證標(biāo)準(zhǔn)。它通過(guò)一些命名空間已經(jīng)定義好的元素類型來(lái)定義我們的XML語(yǔ)法,如:

          <xsd:element name="visits" type="xsd:decimal" />

          這里的xsd就是我們要用到的名字空間。由于目前大部分的XML還都是使用DTD的方式,對(duì)XSD的了解就到這里吧。有興趣的可以去W3C的網(wǎng)站了解具體語(yǔ)法。

           

          posted @ 2005-02-19 20:28 laogao 閱讀(344) | 評(píng)論 (0)編輯 收藏

           

          XML的用途可謂相當(dāng)廣泛,這歸功于它的開放性和強(qiáng)大的描述能力。在接下來(lái)的筆記中,我會(huì)記錄如下幾個(gè)方面的內(nèi)容:

          1. XML驗(yàn)證
          2. XML內(nèi)容提取
          3. XML的轉(zhuǎn)換
          4. XML作為消息傳遞載體
          5. XML數(shù)據(jù)操作
          6. XML存儲(chǔ)

           

          posted @ 2005-02-19 20:17 laogao 閱讀(246) | 評(píng)論 (0)編輯 收藏

           

          XML是eXtensible Markup Language的縮寫,它的前身是SGML,或者說(shuō),XML是SGML的子集。簡(jiǎn)單講,XML是一種文檔格式,作為一種標(biāo)準(zhǔn),有利于不同機(jī)構(gòu)間的數(shù)據(jù)交換。從表面上看,XML是一種語(yǔ)言,但是它同時(shí)也是一種創(chuàng)造和定義其他語(yǔ)言的語(yǔ)言。通過(guò)一組定義好的規(guī)范,我們可以很方便的擴(kuò)展它。

          我們來(lái)看一個(gè)實(shí)際的XML長(zhǎng)什么樣:(僅僅是個(gè)最簡(jiǎn)單的例子,為了說(shuō)明XML的基本結(jié)構(gòu))

          <customer-repository>
            
          <customer index="C82FB7E9982A02FD">
              
          <name first-name="Brian" last-name="Molko"/>
              
          <register-date>
                2005-01-01
              
          </register-date>
              
          <visits>
                3
              
          </visits>
            
          </customer>
            
          <customer index="BADE12908E72CB21">
              
          <name first-name="Alanis" last-name="Morissette"/>
              
          <register-date>
                2005-02-01
              
          </register-date>
              
          <visits>
                1
              
          </visits>
            
          </customer>
          </customer-repository>

          直觀的看,我們這個(gè)XML文件定義了一組客戶,每一個(gè)客戶又有相應(yīng)的ID、姓名、注冊(cè)時(shí)間和到訪次數(shù)。這就是一個(gè)最基本的XML,它很類似HMTL,但是一方面它可以有自定義的標(biāo)簽,另一方面它也要求更加嚴(yán)格的語(yǔ)法,如標(biāo)簽必有開閉且不能重疊等。不僅僅是這樣,通常每個(gè)XML文件都會(huì)對(duì)應(yīng)一組嚴(yán)格定義的語(yǔ)法,以便對(duì)它們進(jìn)行正確的處理,這一點(diǎn)我會(huì)在稍后作更詳細(xì)的說(shuō)明。

           

          posted @ 2005-02-19 20:10 laogao 閱讀(258) | 評(píng)論 (0)編輯 收藏

           

          開發(fā)出IntelliJ IDEA的JetBrains公司出品的Omea Reader是一款RSS閱讀器,在3月31日之前,JetBrains提供免費(fèi)的1.x版本永久注冊(cè)碼,需要經(jīng)常性閱讀RSS新聞的朋友又多了一個(gè)不錯(cuò)的選擇。

          在JetBrains的官網(wǎng)上可以下載最新版和獲取注冊(cè)碼:

          http://www.jetbrains.com/omea/download/reader.html

           

          posted @ 2005-02-18 16:13 laogao 閱讀(265) | 評(píng)論 (0)編輯 收藏

           

          作為J2EE的開發(fā)者,其實(shí)我們每天都面對(duì)著各種各樣的XML文件及應(yīng)用,可以說(shuō)XML幾乎成了我們的家常便飯,從ANT的build.xml到Web Server的web.xml到Struts框架的struts-config到EJB應(yīng)用的ejb-jar.xml到持久層框架如SQLMaps再到RPC中的消息傳遞,XML已經(jīng)滲透到了我們平常開發(fā)工作的每一個(gè)角落,這一事實(shí)充分說(shuō)明了XML強(qiáng)大的功能和生命力。(XML的應(yīng)用范疇當(dāng)然遠(yuǎn)不止這些J2EE的東東)

          然而我們真正了解XML有多少?也許我們并沒(méi)有真正思考過(guò)這樣的問(wèn)題,通常我們只是學(xué)學(xué)某類XML配置文件的寫法,然后依葫蘆畫瓢,僅此而已,甚至在某些情況下我們可以直接通過(guò)圖形界面或自動(dòng)化工具生成所需的XML文檔。當(dāng)我發(fā)現(xiàn)自己雖然做了近4年Java但其實(shí)對(duì)XML知之甚少時(shí),首先是驚訝,然后汗顏,再后來(lái)我就想,索性把XML的基礎(chǔ)拿來(lái)從頭溫習(xí)一下,于是就有了你現(xiàn)在看到的blog文章。

          基本上,我會(huì)記錄最基礎(chǔ)的XML概念和用法,用盡可能簡(jiǎn)單明了的表達(dá)方式讓自己和大家一起對(duì)XML重新來(lái)過(guò)。這些基本的東西清楚以后,我們?cè)倩剡^(guò)頭來(lái)看我們?nèi)粘=佑|到的XML,定當(dāng)有一些更深入的認(rèn)識(shí)。

          本學(xué)習(xí)筆記大致上將分為三塊:I - XML的基本概念,II - XML的用法/用途,III - Java中用于處理XML的API。我將不定期更新本專題。

           

          posted @ 2005-02-17 23:25 laogao 閱讀(304) | 評(píng)論 (0)編輯 收藏

          僅列出標(biāo)題
          共34頁(yè): First 上一頁(yè) 26 27 28 29 30 31 32 33 34 下一頁(yè) 
          主站蜘蛛池模板: 木兰县| 高密市| 肃宁县| 齐河县| 叶城县| 西华县| 友谊县| 亳州市| 盐山县| 康乐县| 嘉鱼县| 乌兰察布市| 宁陕县| 洛川县| 河东区| 通化县| 玛沁县| 股票| 桃源县| 平武县| 辽中县| 香河县| 定边县| 隆尧县| 贵德县| 大兴区| 淳化县| 丹棱县| 云安县| 永丰县| 大化| 隆化县| 庆云县| 遵义市| 齐齐哈尔市| 利川市| 太保市| 通榆县| 浠水县| 崇阳县| 凤山县|