<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Luben Park

    Java Ben 成長(zhǎng)之路

    #

    RSS知識(shí)簡(jiǎn)介:什么是RSS以及RSS的歷史及發(fā)展歷程

    [轉(zhuǎn)]www.rising.com.cn  2005-4-11 16:37:00  信息源:瑞星編譯
    廣告  

        一、什么是RSS?

        也許大家是第一次聽到RSS這個(gè)概念,那什么是RSS呢?RSS是站點(diǎn)用來(lái)和其他站點(diǎn)之間共享內(nèi)容的一種簡(jiǎn)易方式(也叫聚合內(nèi)容),通常被用于新聞和其他按順序排列的網(wǎng)站,例如Blog。一段項(xiàng)目的介紹可能包含新聞的全部介紹等。或者僅僅是額外的內(nèi)容或者簡(jiǎn)短的介紹。這些項(xiàng)目的鏈接通常都能鏈接到全部的內(nèi)容。網(wǎng)絡(luò)用戶可以在客戶端借助于支持RSS的新聞聚合工具軟件,在不打開網(wǎng)站內(nèi)容頁(yè)面的情況下閱讀支持RSS輸出的網(wǎng)站內(nèi)容。

        說(shuō)得更加簡(jiǎn)單一點(diǎn),RSS就是一種用來(lái)分發(fā)和匯集網(wǎng)頁(yè)內(nèi)容的XML格式!如果你還是不太明白,沒(méi)有關(guān)系,RSS是什么其實(shí)基本就不重要,重要的是RSS可以做什么,下面我們就來(lái)了解一下,RSS能給我們帶來(lái)什么?

        小知識(shí)

        BLOG:BLOG是Web Log的簡(jiǎn)稱。在國(guó)內(nèi),人們通常稱它為博客。它是一種作者與讀者以日記風(fēng)格進(jìn)行交互的中介。在軟件社區(qū),人們以博客形式來(lái)共享觀念與思想變得越來(lái)越流行,人們開始以博客的形式互相學(xué)習(xí),博客已經(jīng)成了一個(gè)技術(shù)交流的場(chǎng)所!如:http://blogs.msdn.com 就是MSDN上的一個(gè)blogging。而在國(guó)內(nèi)博客中國(guó)也已經(jīng)越來(lái)越有名。http://www.blogchina.com。

        XML:XML是Extensible Markup Language的簡(jiǎn)寫,一種擴(kuò)展性標(biāo)識(shí)語(yǔ)言。

        二、RSS的歷史

        那么RSS究竟代表什么呢?比較普遍的有兩種說(shuō)法,一種是“Rich Site Summary”或“RDF Site Summary”,另一種是“Really Simple Syndication”,之所以有這些分歧,需要從RSS發(fā)展的歷史說(shuō)起。

        最初的0.90版本RSS是由Netscape公司設(shè)計(jì)的,目的是用來(lái)建立一個(gè)整合了各主要新聞?wù)军c(diǎn)內(nèi)容的門戶,但是0.90版本的RSS規(guī)范過(guò)于復(fù)雜,而一個(gè)簡(jiǎn)化的RSS 0.91版本也隨著Netscape公司對(duì)該項(xiàng)目的放棄而于2000年暫停。

        不久,一家專門從事博客寫作軟件開發(fā)的公司UserLand接手了RSS 0.91版本的發(fā)展,并把它作為其博客寫作軟件的基礎(chǔ)功能之一繼續(xù)開發(fā),逐步推出了0.92、0.93和0.94版本。隨著網(wǎng)絡(luò)博客的流行,RSS作為一種基本的功能也被越來(lái)越多的網(wǎng)站和博客軟件支持。

        在UserLand公司接手并不斷開發(fā)RSS的同時(shí),很多的專業(yè)人士認(rèn)識(shí)到需要通過(guò)一個(gè)第三方、非商業(yè)的組織,把RSS發(fā)展成為一個(gè)通用的規(guī)范,并進(jìn)一步標(biāo)準(zhǔn)化。于是2001年一個(gè)聯(lián)合小組在0.90版本RSS的開發(fā)原則下,以W3C新一代的語(yǔ)義網(wǎng)技術(shù)RDF(Resource Description Framework)為基礎(chǔ),對(duì)RSS進(jìn)行了重新定義,發(fā)布RSS1.0,并將RSS定義為“RDF Site Summary”。但是這項(xiàng)工作沒(méi)有與UserLand公司進(jìn)行有效的溝通,UserLand公司也不承認(rèn)RSS 1.0的有效性,并堅(jiān)持按照自己的設(shè)想進(jìn)一步開發(fā)出RSS的后續(xù)版本,到2002年9月發(fā)布了最新版本RSS 2.0,UserLand公司將RSS定義為“Really Simple Syndication”。

        目前RSS已經(jīng)分化為RSS 0.9x/2.0和RSS 1.0兩個(gè)陣營(yíng),由于分歧的存在和RSS 0.9x/2.0的廣泛應(yīng)用現(xiàn)狀,RSS 1.0還沒(méi)有成為標(biāo)準(zhǔn)化組織的真正標(biāo)準(zhǔn)。

        三、RSS可以干什么?

        1.訂閱BLOG(BLOG上,你可以訂閱你工作中所需的技術(shù)文章;也可以訂閱與你有共同愛好的作者的日志,總之,BLOG上你對(duì)什么感興趣你就可以訂什么)

        2.訂閱新聞(無(wú)論是奇聞怪事、明星消息、體壇風(fēng)云,只要你想知道的,都可以訂閱)

        你再也不用一個(gè)網(wǎng)站一個(gè)網(wǎng)站,一個(gè)網(wǎng)頁(yè)一個(gè)網(wǎng)頁(yè)去逛了。只要這將你需要的內(nèi)容訂閱在一個(gè)RSS閱讀器中,這些內(nèi)容就會(huì)自動(dòng)出現(xiàn)你的閱讀器里,你也不必為了一個(gè)急切想知道的消息而不斷的刷新網(wǎng)頁(yè),因?yàn)橐坏┯辛烁拢琑SS閱讀器就會(huì)自己通知你!

        三、RSS閱讀器

        目前,RSS閱讀器基本可以分為兩類。

        第一類大多數(shù)閱讀器是運(yùn)行在計(jì)算機(jī)桌面上的單機(jī)應(yīng)用程序,通過(guò)所訂閱網(wǎng)站和博客(blog)中的新聞供應(yīng),可自動(dòng)、定時(shí)地更新新聞標(biāo)題。在該類閱讀器中,有Awasu、FeedDemon和RSSReader這三款流行的單機(jī)版閱讀器都提供免費(fèi)試用版和付費(fèi)高級(jí)版,另外,新華網(wǎng)在不久前也推出了一款RSS閱讀器,它不僅是完全是中文界面,而且目前還是完全的免費(fèi)軟件!(后面我們就將以這款軟件為例,為大家介紹怎樣來(lái)使用RSS閱讀器)

        第二類新聞閱讀器通常是內(nèi)嵌于已在計(jì)算機(jī)中運(yùn)行的應(yīng)用程序中。例如,NewsGator內(nèi)嵌在微軟的Outlook中,所訂閱的新聞標(biāo)題位于Outlook的收件箱文件夾中。另外,Pluck內(nèi)嵌在Internet Explorer瀏覽器中!

        四、RSS的聯(lián)合(Syndication)和聚合(Aggregation)

        發(fā)布一個(gè)RSS文件(一般稱為RSS Feed)后,這個(gè)RSS Feed中包含的信息就能直接被其他站點(diǎn)調(diào)用,而且由于這些數(shù)據(jù)都是標(biāo)準(zhǔn)的XML格式,所以也能在其他的終端和服務(wù)中使用,如PDA、手機(jī)、郵件列表等。而且一個(gè)網(wǎng)站聯(lián)盟(比如專門討論旅游的網(wǎng)站系列)也能通過(guò)互相調(diào)用彼此的RSS Feed,自動(dòng)的顯示網(wǎng)站聯(lián)盟中其他站點(diǎn)上的最新信息,這就叫著RSS的聯(lián)合。這種聯(lián)合就導(dǎo)致一個(gè)站點(diǎn)的內(nèi)容更新越及時(shí)、RSS Feed被調(diào)用的越多,該站點(diǎn)的知名度就會(huì)越高,從而形成一種良性循環(huán)。

        而所謂RSS聚合,就是通過(guò)軟件工具的方法從網(wǎng)絡(luò)上搜集各種RSS Feed并在一個(gè)界面中提供給讀者進(jìn)行閱讀。這些軟件可以是在線的WEB工具,如http://my.netscape.com ,http://my.userland.com , http://www.xmltree.com ,http://www.moreover.com ,http://www.oreillynet.com/meerkat 等,也可以是下載到客戶端安裝的工具

        五、RSS的未來(lái)發(fā)展

        隨著越來(lái)越多的站點(diǎn)對(duì)RSS的支持,RSS已經(jīng)成為目前最成功的XML應(yīng)用。RSS搭建了信息迅速傳播的一個(gè)技術(shù)平臺(tái),使得每個(gè)人都成為潛在的信息提供者。相信很快我們就會(huì)看到大量基于RSS的專業(yè)門戶、聚合站點(diǎn)和更精確的搜索引擎。

    posted @ 2006-02-14 08:46 Ben 閱讀(182) | 評(píng)論 (0)編輯 收藏

    有關(guān)webservice的一些介紹和調(diào)用方法

         摘要: [轉(zhuǎn)]http://www.54bk.com/user1/8454/archives/2005/26611.html1. 什么是webservice   從表面上看,Web service 就是一個(gè)應(yīng)用程序,它向外界暴露出一個(gè)能夠通過(guò)Web進(jìn)行調(diào)用的API。這就是說(shuō),你能夠用編程的方法通過(guò)Web來(lái)調(diào)用這個(gè)應(yīng)用程序。   對(duì)Web service 更精確的解釋: Web services是建立可...  閱讀全文

    posted @ 2006-02-13 16:51 Ben 閱讀(670) | 評(píng)論 (0)編輯 收藏

    [轉(zhuǎn)]使用XML的五種場(chǎng)合

    使用XML的五種場(chǎng)合
    主  題:  使用XML的五種場(chǎng)合[精華] 
    作  者:  ChinaOk (藍(lán)蝶[授人以魚,不如授人以漁]) 
    等  級(jí): 
    信 譽(yù) 值:  103 
    所屬論壇:  XML/SOAP 
    問(wèn)題點(diǎn)數(shù):  1 
    回復(fù)次數(shù):  76 
    發(fā)表時(shí)間:  2002-4-8 16:54:32 
    在很多研討會(huì)和培訓(xùn)班上我遇到過(guò)許多人,他們還不明白為什么要使用XML也不知道如何 
    在他們的應(yīng)用中使用XML。一些來(lái)自諸如Gartner公司的報(bào)告建議說(shuō),商業(yè)公司不能再做 
    局外人了,不能對(duì)XML置之不理。如果你還不清楚XML到底有什么好處的話,你并不是唯 
    一的人。 
    我決定把與人們和媒體關(guān)于XML話題的交談?wù)沓晌模谐鯴ML在應(yīng)用中的五個(gè)最令人喜 
    愛的用法。盡管這些并不能包含XML的所有潛在應(yīng)用,至少是些最重要的領(lǐng)域。 
    1、數(shù)據(jù)交換 
    用XML在應(yīng)用程序和公司之間作數(shù)據(jù)交換已不是什么秘密了,毫無(wú)疑問(wèn)應(yīng)被列為第一位。 
    那么為什么XML在這個(gè)領(lǐng)域里的地位這么重要呢?原因就是XML使用元素和屬性來(lái)描述數(shù) 
    據(jù)。在數(shù)據(jù)傳送過(guò)程中,XML始終保留了諸如父/子關(guān)系這樣的數(shù)據(jù)結(jié)構(gòu)。幾個(gè)應(yīng)用程序 
    可以共享和解析同一個(gè)XML文件,不必使用傳統(tǒng)的字符串解析或拆解過(guò)程。 
    相反,普通文件不對(duì)每個(gè)數(shù)據(jù)段做描述(除了在頭文件中),也不保留數(shù)據(jù)關(guān)系結(jié)構(gòu)。使 
    用XML做數(shù)據(jù)交換可以使應(yīng)用程序更具有彈性,因?yàn)榭梢杂梦恢?與普通文件一樣)或用元 
    素名(從數(shù)據(jù)庫(kù))來(lái)存取XML數(shù)據(jù)。 
    2、Web服務(wù) 
    Web服務(wù)是最令人激動(dòng)的革命之一,它讓使用不同系統(tǒng)和不同編程語(yǔ)言的人們能夠相互交 
    流和分享數(shù)據(jù)。其基礎(chǔ)在于Web服務(wù)器用XML在系統(tǒng)之間交換數(shù)據(jù)。交換數(shù)據(jù)通常用XML標(biāo) 
    記,能使協(xié)議取得規(guī)范一致,比如在簡(jiǎn)單對(duì)象處理協(xié)議(Simple Object Access Protoc 
    ol, SOAP)平臺(tái)上。 
    SOAP可以在用不同編程語(yǔ)言構(gòu)造的對(duì)象之間傳遞消息。這意味著一個(gè)C#對(duì)象能夠與一個(gè) 
    Java對(duì)象進(jìn)行通訊。這種通訊甚至可以發(fā)生在運(yùn)行于不同操作系統(tǒng)上的對(duì)象之間。DCOM 
    , CORBA或Java RMI只能在緊密耦合的對(duì)象之間傳遞消息,SOAP則可在松耦合對(duì)象之間傳 
    遞消息。 
    3、內(nèi)容管理 
    XML只用元素和屬性來(lái)描述數(shù)據(jù),而不提供數(shù)據(jù)的顯示方法。這樣,XML就提供了一個(gè)優(yōu) 
    秀的方法來(lái)標(biāo)記獨(dú)立于平臺(tái)和語(yǔ)言的內(nèi)容。 
    使用象XSLT這樣的語(yǔ)言能夠輕易地將XML文件轉(zhuǎn)換成各種格式文件,比如HTML, WML, PD 
    F, flat file, EDI, 等等。XML具有的能夠運(yùn)行于不同系統(tǒng)平臺(tái)之間和轉(zhuǎn)換成不同格式 
    目標(biāo)文件的能力使得它成為內(nèi)容管理應(yīng)用系統(tǒng)中的優(yōu)秀選擇。  
    4、Web集成 
    現(xiàn)在有越來(lái)越多的設(shè)備也支持XML了。使得Web開發(fā)商可以在個(gè)人電子助理和瀏覽器之間 
    用XML來(lái)傳遞數(shù)據(jù)。 
    為什么將XML文本直接送進(jìn)這樣的設(shè)備去呢?這樣作的目的是讓用戶更多地自己掌握數(shù)據(jù) 
    顯示方式,更能體驗(yàn)到實(shí)踐的快樂(lè)。常規(guī)的客戶/服務(wù)(C/S)方式為了獲得數(shù)據(jù)排序或更 
    換顯示格式,必須向服務(wù)器發(fā)出申請(qǐng);而XML則可以直接處理數(shù)據(jù),不必經(jīng)過(guò)向服務(wù)器申 
    請(qǐng)查詢-返回結(jié)果這樣的雙向“旅程”,同時(shí)在設(shè)備也不需要配制數(shù)據(jù)庫(kù)。 
    甚至還可以對(duì)設(shè)備上的XML文件進(jìn)行修改并將結(jié)果返回給服務(wù)器。想像一下,一臺(tái)具有互 
    聯(lián)網(wǎng)功能并支持XML的電冰箱將會(huì)給市場(chǎng)帶來(lái)多么大的沖擊吧。你從此不必早起去取牛奶 
    了! 
    5、配制 
    許多應(yīng)用都將配制數(shù)據(jù)存儲(chǔ)在各種文件里,比如.INI文件。雖然這樣的文件格式已經(jīng)使 
    用多年并一直很好用,但是XML還是以更為優(yōu)秀的方式為應(yīng)用程序標(biāo)記配制數(shù)據(jù)。使用. 
    NET里的類,如XmlDocument和XmlTextReader,將配制數(shù)據(jù)標(biāo)記為XML格式,能使其更具 
    可讀性,并能方便地集成到應(yīng)用系統(tǒng)中去。使用XML配制文件的應(yīng)用程序能夠方便地處理 
    所需數(shù)據(jù),不用象其他應(yīng)用那樣要經(jīng)過(guò)重新編譯才能修改和維護(hù)應(yīng)用系統(tǒng)。 
    如前所述,這里提到的五種使用XML的途徑不包括全部場(chǎng)合。

    posted @ 2006-01-11 16:40 Ben 閱讀(419) | 評(píng)論 (0)編輯 收藏

    [轉(zhuǎn)貼]使用jsp實(shí)現(xiàn)word、excel格式報(bào)表打印

    使用jsp實(shí)現(xiàn)word、excel格式報(bào)表打印
    轉(zhuǎn)載 (evan 原創(chuàng))
     

    title: 使用JSP實(shí)現(xiàn)WORD、EXCEL格式報(bào)表打印

    author: evan

    email: maioto:evan_zhao@hotmail.com

    date: 2003-08-21


    因?yàn)閙s word和excel的文檔都支持html文本格式,因此可以先用word或excel做好模版,另存為Web頁(yè),然后將該html改成jsp,將數(shù)據(jù)部分動(dòng)態(tài)填入即可,不用很辛苦的調(diào)整格式
     
    word頁(yè)面只要在jsp頭設(shè)置如下指令:
    <%@page contentType="application/msword;charset=GBK" %>
     
    excel如下:
    <%@page contentType="application/vnd.ms-excel;charset=GBK" %>

    使用這種方式客戶端必須安裝有office軟件,用戶訪問(wèn)時(shí)將在ie中直接用word或excel打開該頁(yè)面。

    此方法優(yōu)勢(shì)是模板設(shè)計(jì)、調(diào)整方便,無(wú)需在服務(wù)器端使用復(fù)雜的POI或jxl技術(shù),也無(wú)需在客戶端使用ActiveX控件技術(shù),更安全、方便,輕松實(shí)現(xiàn)較好的打印效果。 

    microsoft關(guān)于服務(wù)器端動(dòng)態(tài)創(chuàng)建office文檔的資料(asp示例): 
    http://support.microsoft.com/default.aspx?scid=KB;en-us;301044&
     
    簡(jiǎn)單示例:

    使用word建立一文檔,畫表格如下:
    ----------------------------
    | 用戶名 | 真實(shí)姓名 | 性別 |
    ----------------------------
    | guest  | 路人甲   | 男   |
    ----------------------------
    保存為Web頁(yè)test.htm, 將test.htm改名為test.jsp,修改其中g(shù)uest、路人甲、男為從數(shù)據(jù)庫(kù)動(dòng)態(tài)查詢,如下:

    <%@ page contentType="application/msword;charset=GBK" %>
    <%@ page import="java.sql.*" %>
    <html xmlns:o="urn:schemas-microsoft-com:office:office"
    xmlns:w="urn:schemas-microsoft-com:office:word"
    xmlns="http://www.w3.org/TR/REC-html40">

    <head>
    <meta http-equiv=Content-Type content="text/html; charset=GB2312">
    <meta name=ProgId content=Word.Document>
    <meta name=Generator content="Microsoft Word 9">
    <meta name=Originator content="Microsoft Word 9">
    <title>用戶信息</title>
    <!--[if gte mso 9]><xml>
     <o:DocumentProperties>
      <o:Author>evan zhao</o:Author>
      <o:LastAuthor>evan zhao</o:LastAuthor>
      <o:Revision>1</o:Revision>
      <o:TotalTime>1</o:TotalTime>
      <o:Created>2003-08-20T16:26:00Z</o:Created>
      <o:LastSaved>2003-08-20T16:27:00Z</o:LastSaved>
      <o:Pages>1</o:Pages>
      <o:Company>taiping</o:Company>
      <o:Lines>1</o:Lines>
      <o:Paragraphs>1</o:Paragraphs>
      <o:Version>9.2812</o:Version>
     </o:DocumentProperties>
    </xml><![endif]--><!--[if gte mso 9]><xml>
     <w:WordDocument>
      <w:PunctuationKerning>
      <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
      <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
      <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
      <w:Compatibility>
       <w:SpaceForUL>
       <w:BalanceSingleByteDoubleByteWidth>
       <w:DoNotLeaveBackslashAlone>
       <w:ULTrailSpace>
       <w:DoNotExpandShiftReturn>
       <w:AdjustLineHeightInTable>
       <w:UseFELayout>
      </w:Compatibility>
     </w:WordDocument>
    </xml><![endif]-->
    <style>
    <!--
     /* Font Definitions */
    @font-face
        {font-family:宋體;
        panose-1:2 1 6 0 3 1 1 1 1 1;
        mso-font-alt:SimSun;
        mso-font-charset:134;
        mso-generic-font-family:auto;
        mso-font-pitch:variable;
        mso-font-signature:3 135135232 16 0 262145 0;}
    @font-face
        {font-family:"\@宋體";
        panose-1:2 1 6 0 3 1 1 1 1 1;
        mso-font-charset:134;
        mso-generic-font-family:auto;
        mso-font-pitch:variable;
        mso-font-signature:3 135135232 16 0 262145 0;}
     /* Style Definitions */
    p.MsoNormal, li.MsoNormal, div.MsoNormal
        {mso-style-parent:"";
        margin:0cm;
        margin-bottom:.0001pt;
        text-align:justify;
        text-justify:inter-ideograph;
        mso-pagination:none;
        font-size:10.5pt;
        mso-bidi-font-size:12.0pt;
        font-family:"Times New Roman";
        mso-fareast-font-family:宋體;
        mso-font-kerning:1.0pt;}
     /* Page Definitions */
    @page
        {mso-page-border-surround-header:no;
        mso-page-border-surround-footer:no;}
    @page Section1
        {size:595.3pt 841.9pt;
        margin:72.0pt 90.0pt 72.0pt 90.0pt;
        mso-header-margin:42.55pt;
        mso-footer-margin:49.6pt;
        mso-paper-source:0;
        layout-grid:15.6pt;}
    div.Section1
        {page:Section1;}
    -->
    </style>
    </head>

    <body lang=ZH-CN style='tab-interval:21.0pt;text-justify-trim:punctuation'>

    <div class=Section1 style='layout-grid:15.6pt'>


    <table border=1 cellspacing=0 cellpadding=0 style='border-collapse:collapse;
     border:none;mso-border-alt:solid windowtext .5pt;mso-padding-alt:0cm 5.4pt 0cm 5.4pt'>
     <tr>
      <td width=189 valign=top style='width:142.0pt;border:solid windowtext .5pt;
      padding:0cm 5.4pt 0cm 5.4pt'>
      <p class=MsoNormal><span style='font-family:宋體;mso-ascii-font-family:"Times New Roman";
      mso-hansi-font-family:"Times New Roman"'>用戶名</span></p>
      </td>
      <td width=189 valign=top style='width:142.05pt;border:solid windowtext .5pt;
      border-left:none;mso-border-left-alt:solid windowtext .5pt;padding:0cm 5.4pt 0cm 5.4pt'>
      <p class=MsoNormal><span style='font-family:宋體;mso-ascii-font-family:"Times New Roman";
      mso-hansi-font-family:"Times New Roman"'>真實(shí)姓名</span></p>
      </td>
      <td width=189 valign=top style='width:142.05pt;border:solid windowtext .5pt;
      border-left:none;mso-border-left-alt:solid windowtext .5pt;padding:0cm 5.4pt 0cm 5.4pt'>
      <p class=MsoNormal><span style='font-family:宋體;mso-ascii-font-family:"Times New Roman";
      mso-hansi-font-family:"Times New Roman"'>性別</span></p>
      </td>
     </tr>
    <%
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 

    String url="jdbc:odbc:mydb";

    //連接mydb數(shù)據(jù)庫(kù)
    Connection con=DriverManager.getConnection (url, "", ""); 

    try{
      Statement stmt=con.createStatement(); 

      //查詢employee表
      ResultSet rs=stmt.executeQuery("select user_name, real_name, gender from employee ");

      while(rs.next()){
    %>

     <tr>
      <td width=189 valign=top style='width:142.0pt;border:solid windowtext .5pt;
      border-top:none;mso-border-top-alt:solid windowtext .5pt;padding:0cm 5.4pt 0cm 5.4pt'>
      <p class=MsoNormal><span lang=EN-US><%=rs.getString("user_name")%></span></p>
      </td>
      <td width=189 valign=top style='width:142.05pt;border-top:none;border-left:
      none;border-bottom:solid windowtext .5pt;border-right:solid windowtext .5pt;
      mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
      padding:0cm 5.4pt 0cm 5.4pt'>
      <p class=MsoNormal><span style='font-family:宋體;mso-ascii-font-family:"Times New Roman";
      mso-hansi-font-family:"Times New Roman"'><%=rs.getString("real_name")%></span></p>
      </td>
      <td width=189 valign=top style='width:142.05pt;border-top:none;border-left:
      none;border-bottom:solid windowtext .5pt;border-right:solid windowtext .5pt;
      mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
      padding:0cm 5.4pt 0cm 5.4pt'>
      <p class=MsoNormal><span style='font-family:宋體;mso-ascii-font-family:"Times New Roman";
      mso-hansi-font-family:"Times New Roman"'><%=rs.getString("gender")%></span></p>
      </td>
     </tr>

    <%
      } // end while
      
      rs.close();
      stmt.close();
    } finally {
      con.close();
    }
    %> 
     
    </table>

    <p class=MsoNormal><span lang=EN-US><![if !supportEmptyParas]> <![endif]><o:p></o:p></span></p>

    </div>

    </body>

    </html>

    posted @ 2006-01-05 20:00 Ben 閱讀(457) | 評(píng)論 (0)編輯 收藏

    [轉(zhuǎn)帖]XML輕松學(xué)習(xí)手冊(cè)


    轉(zhuǎn)載自:http://www.knowsky.com/2991.html

    XML輕松學(xué)習(xí)手冊(cè)(1)XML快速入門

    文章類別:XML教程   發(fā)表日期:2003-6-3  星期二  
    --------------------------------------------------------------------------------
    轉(zhuǎn)自:動(dòng)態(tài)網(wǎng)制作指南 www.knowsky.com
    前言

    XML越來(lái)越熱,關(guān)于XML的基礎(chǔ)教程網(wǎng)絡(luò)上也隨處可見。可是一大堆的概念和術(shù)語(yǔ)往往讓人望而生畏,很多朋友問(wèn)我:XML到底有什么用,我們是否需要學(xué)習(xí)它?我想就我個(gè)人學(xué)習(xí)過(guò)程的心得和經(jīng)驗(yàn),寫一篇比較全面的介紹文章。首先有兩點(diǎn)是需要肯定的: 

    第一:XML肯定是未來(lái)的發(fā)展趨勢(shì),不論是網(wǎng)頁(yè)設(shè)計(jì)師還是網(wǎng)絡(luò)程序員,都應(yīng)該及時(shí)學(xué)習(xí)和了解,等待只會(huì)讓你失去機(jī)會(huì); 

    第二:新知識(shí)肯定會(huì)有很多新概念,嘗試?yán)斫夂徒邮埽趴赡芴岣摺2灰ε潞吞颖埽吘刮覀冞€年輕。 

    提綱

    本文共分五大部分。分別是XML快速入門,XML的概念,XML的術(shù)語(yǔ),XML的實(shí)現(xiàn),XML的實(shí)例分析。最后附錄介紹了XML的相關(guān)資源。作者站在普通網(wǎng)頁(yè)設(shè)計(jì)人員的角度,用平實(shí)生動(dòng)的語(yǔ)言,向您講述XML的方方面面,幫助你撥開XML的神秘面紗,快速步入XML的新領(lǐng)域。 

    第一章:XML快速入門

    一. 什么是XML? 

    二. XML是新概念嗎? 

    三. 使用XML有什么好處? 

    四. XML很難學(xué)嗎? 

    五. XML和HTML的區(qū)別 

    六. XML的嚴(yán)格格式 

    七. 關(guān)于XML的更多 

    一. 什么是XML?

     

    這往往是第一個(gè)問(wèn)題,也往往在第一個(gè)問(wèn)題上你就會(huì)搞不明白,因?yàn)榇蠖嗟慕滩纳线@樣回答:

    XML是Extensible Markup Language的簡(jiǎn)寫,一種擴(kuò)展性標(biāo)識(shí)語(yǔ)言。 這是標(biāo)準(zhǔn)的定義。那么什么是標(biāo)志語(yǔ)言,為什么叫擴(kuò)展性?已經(jīng)讓人有些糊涂。我想我們這樣來(lái)理解會(huì)好一些:

    對(duì)HTML你已經(jīng)非常熟悉了吧,它就是一種標(biāo)記語(yǔ)言,記得它的全稱嗎:"Hypertext Markup Language" 超文本標(biāo)記語(yǔ)言。明白了?同時(shí),HTML里面有很多標(biāo)簽,類似,等,都是在HTML 
    4.0里規(guī)范和定義,而XML里允許你自己創(chuàng)建這樣的標(biāo)簽,所以叫做可擴(kuò)展性。

    這里有幾個(gè)容易混淆的概念要提醒大家:

    1.XML并不是標(biāo)記語(yǔ)言。它只是用來(lái)創(chuàng)造標(biāo)記語(yǔ)言(比如HTML)的元語(yǔ)言。天,又糊涂了!不要緊,你只要知道這一點(diǎn):XML和HTML是不一樣的,它的用處途比HTML廣泛得多,我們將在后面仔細(xì)介紹。

    2.XML并不是HTML的替代產(chǎn)品。XML不是HTML的升級(jí),它只是HTML的補(bǔ)充,為HTML擴(kuò)展更多功能。我們?nèi)詫⒃谳^長(zhǎng)的一段時(shí)間里繼續(xù)使用HTML。(但值得注意的是HTML的升級(jí)版本XHTML的確正在向適應(yīng)XML靠攏。)

    3.不能用XML來(lái)直接寫網(wǎng)頁(yè)。即便是包含了XML數(shù)據(jù),依然要轉(zhuǎn)換成HTML格式才能在瀏覽器上顯示。

    下面就是一段XML示例文檔(例1),用來(lái)表示本文的信息:

    <myfile>

    <title>XML Quick Start</title>

    <author>ajie</author>

    <email>ajie@aolhoo.com</email>

    <date>20010115</date>

    </myfile> 

     

    注意:

     

    1.這段代碼僅僅是代碼,讓你初步感性認(rèn)識(shí)一下XML,并不能實(shí)現(xiàn)什么具體應(yīng)用;

    2.其中類似< title>,< author>的語(yǔ)句就是自己創(chuàng)建的標(biāo)記(tags),它們和HTML標(biāo)記不一樣,例如這里的< title>是文章標(biāo)題的意思,HTML里的< title>是頁(yè)面標(biāo)題。

    二. XML是新概念嗎? 

    不是。XML來(lái)源于SGML,一種比HTML更早的標(biāo)志語(yǔ)言標(biāo)準(zhǔn)。 

    關(guān)于SGML,我們來(lái)簡(jiǎn)單了解一下,你只需要有個(gè)大致概念就可以。 

    SGML全稱是"Standard Generalized Markup Language"(通用標(biāo)識(shí)語(yǔ)言標(biāo)準(zhǔn))。看名稱就知道:它是標(biāo)志語(yǔ)言的標(biāo)準(zhǔn),也就是說(shuō)所有標(biāo)志語(yǔ)言都是依照SGML制定的,當(dāng)然包括HTML。SGML的覆蓋面很廣,凡是有一定格式的文件都屬于SGML,比如報(bào)告,樂(lè)譜等等,HTML是SGML在網(wǎng)絡(luò)上最常見的文件格式。因此,人們戲稱SGML是HTML的"媽媽"。 


    而XML就是SGML的簡(jiǎn)化版,只不過(guò)省略了其中復(fù)雜和不常用的部分。(哦,明白了!是HTML第二個(gè)"mother",難怪比HTML功能強(qiáng)大呢。),和SGML一樣,XML也可以應(yīng)用在金融,科研等各個(gè)領(lǐng)域,我們這里講的,只是XML在web方面的運(yùn)用而已。 


    到這里,你應(yīng)該有點(diǎn)明白了:XML是用來(lái)創(chuàng)建定義類似HTML的標(biāo)記語(yǔ)言,然后再用這個(gè)標(biāo)記語(yǔ)言來(lái)顯示信息。 三. 使用XML有什么好處? 

    有了HTML,為什么還需要用XML? 

    因?yàn)楝F(xiàn)在網(wǎng)絡(luò)應(yīng)用越來(lái)越廣泛,僅僅靠HTML單一文件類型來(lái)處理千變?nèi)f化的文檔和數(shù)據(jù)已經(jīng)力不叢心,而且HTML本身語(yǔ)法十分不嚴(yán)密,嚴(yán)重影響網(wǎng)絡(luò)信息傳送和共享。(想想瀏覽器兼容的問(wèn)題傷透多少設(shè)計(jì)師的腦細(xì)胞啊。)人們?cè)缫呀?jīng)開始探討用什么方法來(lái)滿足網(wǎng)絡(luò)上各種應(yīng)用的需要。使用SGML是可以的,但SGML太龐大,編程復(fù)雜,于是最終選擇了"減肥"的SGML---XML作為下一代web運(yùn)用的數(shù)據(jù)傳輸和交互的工具。 


    使用XML有什么好處?來(lái)看w3c組織(XML標(biāo)準(zhǔn)制定者)的說(shuō)明: 

    XML使得在網(wǎng)絡(luò)上使用SGML語(yǔ)言更加"簡(jiǎn)單和直接": 簡(jiǎn)化了定義文件類型的過(guò)程,簡(jiǎn)化了編程和處理SGML文件的過(guò)程,簡(jiǎn)化了在Web上的傳送和共享。 


    1.XML可以廣泛的運(yùn)用于web的任何地方; 

    2.XML可以滿足網(wǎng)絡(luò)應(yīng)用的需求; 

    3.使用XML將使編程更加簡(jiǎn)單; 

    4.XML便于學(xué)習(xí)和創(chuàng)建; 

    5.XML代碼將清晰和便于閱讀理解; 

    還是抽象了些。讓我們?cè)诤竺娴膶?shí)例教程中慢滿體會(huì)XML的強(qiáng)大優(yōu)勢(shì)吧! 

    四. XML很難學(xué)嗎?

    如果你有興趣學(xué)習(xí)XML,不禁會(huì)問(wèn):XML難嗎?學(xué)習(xí)XML需要什么樣的基礎(chǔ)?

    XML非常簡(jiǎn)單,學(xué)習(xí)容易。如果你熟悉HTML,你會(huì)發(fā)現(xiàn)它的文檔和HTML非常相似,看同樣的示例文檔(例1):

    ?xml version="1.0"?>

    <myfile>

    <title>XML Quick Start</title>

    <author>ajie</author>

    <email>ajie@aolhoo.com</email>

    <date>20010115</date>

    </myfile>

    第一行是一個(gè)XML聲明,表示文檔遵循的是XML的1.0 版的規(guī)范。

    第二行定義了文檔里面的第一個(gè)元素(element),也稱為根元素: < myfile>。這個(gè)就類似HTML里的< HTML>開頭標(biāo)記。注意,這個(gè)名稱是自己隨便定義的。

    再下面定義了四個(gè)子元素:title,author,email,和date。分別說(shuō)明文章的標(biāo)題,作者,郵箱和日期。當(dāng)然,你可以用中文來(lái)定義這些標(biāo)簽,看上去更便于理解: 
    <?xml version="1.0" encoding="GB2312"?>

    <文章>

    <標(biāo)題>XML輕松學(xué)習(xí)手冊(cè)</標(biāo)題>

    <作者>ajie</作者>

    <信箱>ajie@aolhoo.com</信箱>

    <日期>20010115</日期>

    </文章>

     

    這就是XML的文檔,任何掌握HTML的網(wǎng)友都可以直接寫出這樣簡(jiǎn)單的XML文檔。

    另外,學(xué)習(xí)XML還必須掌握一種頁(yè)面腳本語(yǔ)言,常見的就是javascript和VB script。因?yàn)閄ML數(shù)據(jù)是使用script實(shí)現(xiàn)HTML中調(diào)用和交互的。我們看一個(gè)最簡(jiǎn)單的例子(例2):

    1.將下面代碼存為myfile.htm


    <html>

    <head>

    <script language="javascript" for="window" event="onload">

    var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");

    xmlDoc.async="false";

    xmlDoc.load("myfile.xml");

    nodes = xmlDoc.documentElement.childNodes;

    title.innerText = nodesitem(0).text;

    author.innerText = nodes.item(1).text;

    email.innerText = nodes.item(2).text;

    date.innerText = nodes.item(3).text;

    </script>

    <title>在HTML中調(diào)用XML數(shù)據(jù)</title>

    </head>

    <body bgcolor="#FFFFFF">

    <b>標(biāo)題: </b>

    <span id="title"> </span>

    <b>作者: </b>>

    <span id="author"></span>

    <b>信箱: </b>

    <span id="email"></span>

    <b>日期:</b>

    <span id="date"></span>

    </body>

    </html>


    2.將下面代碼存為myfile.xml


    <?xml version="1.0" encoding="GB2312"?>

    <myfile>

    <title>XML輕松學(xué)習(xí)手冊(cè)</title>

    <author>ajie</author>

    <email>ajie@aolhoo.com</email>

    <date>20010115</date>

    </myfile>


    3.將它們放在同一個(gè)目錄下,用IE5以上版本瀏覽器打開,可以看到效果。 學(xué)習(xí)并掌握一種script,你將真正了解到XML無(wú)比的強(qiáng)大的功能。

    五. XML和HTML的區(qū)別 

     

    XML和HTML都來(lái)自于SGML,它們都含有標(biāo)記,有著相似的語(yǔ)法,HTML和XML的最大區(qū)別在于:HTML是一個(gè)定型的標(biāo)記語(yǔ)言,它用固有的標(biāo)記來(lái)描述,顯示網(wǎng)頁(yè)內(nèi)容。比如< H1>表示首行標(biāo)題,有固定的尺寸。相對(duì)的,XML則沒(méi)有固定的標(biāo)記,XML不能描述網(wǎng)頁(yè)具體的外觀,內(nèi)容,它只是描述內(nèi)容的數(shù)據(jù)形式和結(jié)構(gòu)。 

     


    這是一個(gè)質(zhì)的區(qū)別:網(wǎng)頁(yè)將數(shù)據(jù)和顯示混在一起,而XML則將數(shù)據(jù)和顯示分開來(lái)。 

     

    我們看上面的例子,在myfile.htm中,我們只關(guān)心頁(yè)面的顯示方式,我們可以設(shè)計(jì)不同的界面,用不同的方式來(lái)排版頁(yè)面,但數(shù)據(jù)是儲(chǔ)存在myfile.xml中,不需要任何改變。 

     


    (如果你是程序員,你會(huì)驚訝的發(fā)現(xiàn),這與模塊化面向?qū)ο缶幊痰乃枷霕O其相似!其實(shí)網(wǎng)頁(yè)何嘗不是一種程序呢?) 

     

    正是這種區(qū)別使得XML在網(wǎng)絡(luò)應(yīng)用和信息共享上方便,高效,可擴(kuò)展。所以我們相信,XML做為一種先進(jìn)的數(shù)據(jù)處理方法,將使網(wǎng)絡(luò)跨越到一個(gè)新的境界。

     

    六. XML的嚴(yán)格格式

     

    吸取HTML松散格式帶來(lái)的經(jīng)驗(yàn)教訓(xùn),XML一開始就堅(jiān)持實(shí)行"良好的格式"。

    我們先看HTML的一些語(yǔ)句,這些語(yǔ)句在HTML中隨處可見:

    1.

    sample


    2.< b>< i>sample< /b>< /i>


    3.< td>sample< /TD>


    4.< font color=red>samplar< /font>


    在XML文檔中,上述幾種語(yǔ)句的語(yǔ)法都是錯(cuò)誤的。因?yàn)?

    1.所有的標(biāo)記都必須要有一個(gè)相應(yīng)的結(jié)束標(biāo)記;

    2.所有的XML標(biāo)記都必須合理嵌套;

    3.所有XML標(biāo)記都區(qū)分大小寫;

    4.所有標(biāo)記的屬性必須用""括起來(lái);

    所以上列語(yǔ)句在XML中正確的寫法是

    1.
    sample

    2.< b>< i>sample< /i>< /b>
    3.< td>sample< /td>
    4.< font color="red">samplar< /font>

      另外,XML標(biāo)記必須遵循下面的命名規(guī)則:

    1.名字中可以包含字母、數(shù)字以及其它字母; 

    2.名字不能以數(shù)字或"_" (下劃線) 開頭;

    3.名字不能以字母 xml (或 XML 或 Xml ..) 開頭;

    4.名字中不能包含空格。

    在XML文檔中任何的差錯(cuò),都會(huì)得到同一個(gè)結(jié)果:網(wǎng)頁(yè)不能被顯示。各瀏覽器開發(fā)商已經(jīng)達(dá)成協(xié)議,對(duì)XML實(shí)行嚴(yán)格而挑剔的解析,任何細(xì)小的錯(cuò)誤都會(huì)被報(bào)告。你可以將上面的myfile.xml修改一下,比如將< email>改為< Email>,然后用IE5直接打開myfile.xml,會(huì)得到一個(gè)出錯(cuò)信息頁(yè)面:


    <?xml version="1.0" encoding="GB2312"?>

    <myfile>

    <title>XML輕松學(xué)習(xí)手冊(cè)</title>

    <author>ajie</author>

    <Email>ajie@aolhoo.com</email>

    <date>20010115</date>

    </myfile> 

    七. 關(guān)于XML的更多 

    好了,到現(xiàn)在你已經(jīng)知道: 

    1.什么是XML; 
    2.XML,HTML,SGML之間的關(guān)系和區(qū)別; 
    3.XML的簡(jiǎn)單應(yīng)用。 

    恭喜你!你已經(jīng)不再對(duì)XML一無(wú)所知,并且已經(jīng)走在了網(wǎng)絡(luò)技術(shù)的前沿。整個(gè)學(xué)習(xí)過(guò)程好象并不很難哦:) 

    如果你對(duì)XML有更多的興趣,希望進(jìn)一步了解XML的詳細(xì)資料和其它的實(shí)際運(yùn)用技術(shù),歡迎繼續(xù)瀏覽我們的下一章:XML的概念。
     
    XML輕松學(xué)習(xí)手冊(cè)(2)XML概念

    第二章 XML概念

    導(dǎo)言 

    經(jīng)過(guò)第一章的快速入門學(xué)習(xí),你已經(jīng)知道了XML是一種能夠讓你自己創(chuàng)造標(biāo)識(shí)的語(yǔ)言,它可以將數(shù)據(jù)與格式從網(wǎng)頁(yè)中分開,它可以儲(chǔ)存數(shù)據(jù)和共享數(shù)據(jù)的特性使得XML無(wú)所不能。如果你希望深入學(xué)習(xí)XML,系統(tǒng)掌握XML的來(lái)龍去脈,那么我們首先還是要回到XML概念的問(wèn)題上來(lái)。XML(Extensible Markup Language),一種擴(kuò)展性標(biāo)識(shí)語(yǔ)言。"擴(kuò)展性""標(biāo)識(shí)""語(yǔ)言"。每一個(gè)詞都明確的點(diǎn)明了XML的重要特點(diǎn)和功能。我們來(lái)仔細(xì)分析: 

    一. 擴(kuò)展性 
    二. 標(biāo)識(shí) 
    三. 語(yǔ)言 
    四. 結(jié)構(gòu)化 
    五. Meta數(shù)據(jù) 
    六. 顯示 
    七. DOM 

    一.擴(kuò)展性---使用XML,你可以為你的文檔建立自己的標(biāo)記(tags)。 

    XML的第一個(gè)詞是"擴(kuò)展性",這正是XML強(qiáng)大的功能和彈性的原因。 
    在HTML里,有許多固定的標(biāo)記,我們必須記住然后使用它們,你不能使用HTML規(guī)范里沒(méi)有的標(biāo)記。而在XML中,你能建立任何你需要的標(biāo)記。你可以充分發(fā)揮你的想象力,給你的文檔起一些好記的標(biāo)記名稱。比如,你的文檔里包含一些游戲的攻略,你可以建立一個(gè)名為<game>的標(biāo)記,然后在<game>下再根據(jù)游戲類別建立<RPG>,<SLG>等標(biāo)記。只要清晰,易于理解你可以建立任何數(shù)量的標(biāo)記。 

    一開始你也許會(huì)不適應(yīng),因?yàn)槲覀冊(cè)趯W(xué)習(xí)HTML時(shí),有固定的標(biāo)記可以直接學(xué)習(xí)和使用;(很多人包括我自己都是邊分析別人的代碼和標(biāo)識(shí),邊建立自己的網(wǎng)頁(yè)),而XML卻沒(méi)有任何標(biāo)記可以學(xué),也很少有文檔的標(biāo)記是一模一樣的。我們?cè)趺崔k?呵呵,沒(méi)有就自己創(chuàng)建呀。一旦你真正開始寫XML文檔,你會(huì)發(fā)現(xiàn)隨心所欲的創(chuàng)造新標(biāo)記也是一份很有趣的事。你可以建立有自己特色的標(biāo)記,甚至建立你自己的HTML語(yǔ)言。 

    擴(kuò)展性使你有更多的選擇和強(qiáng)大的能力,但同時(shí)也產(chǎn)生一個(gè)問(wèn)題就是你必須學(xué)會(huì)規(guī)劃。你自己要理解自己的文檔,知道它由哪幾部分組成,相互之間的關(guān)系和如何識(shí)別它們。 

    關(guān)于建立標(biāo)識(shí)還需要說(shuō)明一點(diǎn),標(biāo)識(shí)是描述數(shù)據(jù)的類型或特性,比如<width>,年齡<age>,姓名<name>等,而不是數(shù)據(jù)的內(nèi)容,比如:<10pxl>,<18>,<張三>,這些都是無(wú)用的標(biāo)記。如果你學(xué)過(guò)數(shù)據(jù)庫(kù),你可以這樣理解,標(biāo)識(shí)就是一種字段名。 

    二.標(biāo)識(shí)---使用XML你可以識(shí)別文檔中的元素。 

    XML的第二個(gè)詞是"標(biāo)識(shí)",這表明了XML的目的是標(biāo)識(shí)文檔中的元素。 

    不論你是HTML,還是XML,標(biāo)識(shí)的本質(zhì)在于便于理解,如果沒(méi)有標(biāo)識(shí),你的文檔在計(jì)算機(jī)看來(lái)只是一個(gè)很長(zhǎng)的字符串,每個(gè)字看起來(lái)都一樣,沒(méi)有重點(diǎn)之分。 

    通過(guò)標(biāo)識(shí),你的文檔才便于閱讀和理解,你可以劃分段落,列明標(biāo)題。XML中,你更可以利用其擴(kuò)展性 來(lái)為文檔建立更合適的標(biāo)識(shí)。 

    不過(guò),有一點(diǎn)要提醒大家注意:標(biāo)識(shí)僅僅是用來(lái)識(shí)別信息,它本身并不傳達(dá)信息。例如這樣的HTML代碼: 

    <b>frist step<b> 
    這里<b>表示粗體,只用來(lái)說(shuō)明是用粗體來(lái)顯示"frist step"字符,<b>本身并不包含任何實(shí)際的信息,在頁(yè)面上你看不到<b>,真正傳達(dá)信息的是"frist step "。 

    三.語(yǔ)言---使用XML你要遵循特定的語(yǔ)法來(lái)標(biāo)識(shí)你的文檔。 

    XML第三個(gè)詞是"語(yǔ)言"。這表明了作為一種語(yǔ)言XML必須遵循一定的規(guī)則。雖然XML的擴(kuò)展性允許你創(chuàng)建新標(biāo)識(shí),但它仍然必須遵循特定的結(jié)構(gòu),語(yǔ)法和明確的定義。 

    在計(jì)算機(jī)領(lǐng)域,語(yǔ)言常常表示一?quot;程序語(yǔ)言",用來(lái)編程實(shí)現(xiàn)一些功能和應(yīng)用,但不是所有的"語(yǔ)言"都是用來(lái)編程的,XML就只是一種用來(lái)定義標(biāo)識(shí)和描述信息的語(yǔ)言。 

    下面我們來(lái)深入了解一下XML應(yīng)用的其本原理,可能會(huì)很枯燥,但是對(duì)于整體的理解很重要,你可以先快速過(guò)一遍,心里有一個(gè)模糊的概念,具體精髓則需要在實(shí)踐中慢慢領(lǐng)會(huì)。

    四.結(jié)構(gòu)化---XML促使文檔結(jié)構(gòu)化,所有的信息按某種關(guān)系排列。 

    "結(jié)構(gòu)化"聽起來(lái)太抽象了,我們這樣理解,結(jié)構(gòu)化就是為你的文檔建立一個(gè)框架,就象寫文章先寫一個(gè)提綱。結(jié)構(gòu)化使你的文檔看起來(lái)不會(huì)雜亂無(wú)章,每一部分都緊密聯(lián)系,形成一個(gè)整體。 

    結(jié)構(gòu)化有兩個(gè)原則: 
    1.每一部分(每一個(gè)元素)都和其他元素有關(guān)聯(lián)。關(guān)聯(lián)的級(jí)數(shù)就形成了結(jié)構(gòu)。 
    2.標(biāo)識(shí)本身的含義與它描述的信息相分離。 

    我們來(lái)看一個(gè)簡(jiǎn)單的例子幫助理解: 
    <?xml version="1.0" encoding="GB2312"?>
    <myfile>
    <title>XML輕松學(xué)習(xí)手冊(cè)</title>
    <chapter>XML快速入門
    <para>什么是XML</para>
    <para>使用XML的好處</para>
    </chapter>
    <chapter>XML的概念
    <para>擴(kuò)展性</para>
    <para>標(biāo)識(shí)</para>
    </chapter>
    </myfile>
    這是本文的XML描述文檔,可以看到標(biāo)識(shí)分三級(jí)關(guān)聯(lián),非常清晰: 
    <myfile>
    <chapter>
    <para>
    ...
    </para>
    </chapter>
    </myfile>
    上面這樣的文檔結(jié)構(gòu),我們又稱之為"文檔樹",主干是父元素,如<myfile>,分支和頁(yè)是子元素,如<chapter>和<para>。 

    五.Meta數(shù)據(jù)(Metadata)---專業(yè)的XML使用者會(huì)使用meta數(shù)據(jù)來(lái)工作。 

    在HTML中我們知道可以使用meta標(biāo)識(shí)來(lái)定義網(wǎng)頁(yè)的關(guān)鍵字,簡(jiǎn)介等,這些標(biāo)識(shí)不會(huì)顯示在網(wǎng)頁(yè)中,但可以被搜索引擎搜索到,并影響搜索結(jié)果的排列順序。 

    XML對(duì)這一原理進(jìn)行了深化和擴(kuò)展,用XML,你可以描述你的信息在哪里,你可以通過(guò)meta來(lái)驗(yàn)證信息,執(zhí)行搜索,強(qiáng)制顯示,或者處理其他的數(shù)據(jù)。 

    下面是一些XML metadata在實(shí)際應(yīng)用中的用途: 

    1.可以驗(yàn)證數(shù)字簽名,使在線商務(wù)的提交動(dòng)作(submission)有效。 
    2.可以被方便的建立索引和進(jìn)行更有效搜索。 
    3.可以在不同語(yǔ)言之間傳輸數(shù)據(jù)。 

    W3C組織正在研究一種名為RDF(Resource Description Framework)的metadata處理方法,可以自動(dòng)交換信息,W3C宣稱,使用RDF配合數(shù)字簽名,將使網(wǎng)絡(luò)中存在"真實(shí)可信"的電子商務(wù)。 

    六.顯示 

    單獨(dú)用XMl不能顯示頁(yè)面,我們使用格式化技術(shù),比如CSS或者XSL,才能顯示XML標(biāo)記創(chuàng)建的文檔。 

    我們?cè)谇懊娴谝徽轮v到XML是將數(shù)據(jù)和格式分離的。XML文檔本身不知道如何來(lái)顯示,必須有輔助文件來(lái)幫助實(shí)現(xiàn)。(XML取消了所有標(biāo)識(shí),包括font,color,p等風(fēng)格樣式定義標(biāo)識(shí),因此XML全部是采用類似DHTML中CSS的方法來(lái)定義文檔風(fēng)格樣式。),XML中用來(lái)設(shè)定顯示風(fēng)格樣式的文件類型有: 

    1.XSL 

    XSL全稱是Extensible Stylesheet Language(可擴(kuò)展樣式語(yǔ)言), 是將來(lái)設(shè)計(jì)XML文檔顯示樣式的主要文件類型。它本身也是基于XML語(yǔ)言的。使用XSL,你可以靈活的設(shè)置文檔顯示樣式,文檔將自動(dòng)適應(yīng)任何瀏覽器和PDA(掌上電腦)。 

    XSL也可以將XML轉(zhuǎn)化為HTML,那樣,老的瀏覽器也可以瀏覽XML文檔了。 

    2.CSS 

    CSS大家很熟悉了,全稱是Cascading Style Sheets(層疊樣式表),是目前用來(lái)在瀏覽器上顯示XML文檔的主要方法。 

    3.Behaviors 

    Behaviors現(xiàn)在還沒(méi)有成為標(biāo)準(zhǔn)。它是微軟的IE瀏覽器特有的功能,用它可以對(duì)XML標(biāo)識(shí)設(shè)定一些有趣動(dòng)作。 

    七.DOM 

    DOM全稱是document object model(文檔對(duì)象模型),DOM是用來(lái)干什么的呢?假設(shè)把你的文檔看成一個(gè)單獨(dú)的對(duì)象,DOM就是如何用HTML或者XML對(duì)這個(gè)對(duì)象進(jìn)行操作和控制的標(biāo)準(zhǔn)。 

    面向?qū)ο蟮乃枷敕椒ㄒ呀?jīng)非常流行了,在編程語(yǔ)言(例如java,js)中,都運(yùn)用面向?qū)ο蟮木幊趟枷搿T赬ML中,就是要將網(wǎng)頁(yè)也作為一個(gè)對(duì)象來(lái)操作和控制,我們可以建立自己的對(duì)象和模板。與對(duì)象進(jìn)行交流,如何命令對(duì)象,就要用到API。API全稱Application Programming Interface,它是訪問(wèn)和操作對(duì)象的規(guī)則。而DOM就是一種詳細(xì)描述HTML/XML文檔對(duì)象規(guī)則的API。它規(guī)定了HTML/XML文檔對(duì)象的命名協(xié)定,程序模型,溝通規(guī)則等。在XML文檔中,我們可以將每一個(gè)標(biāo)識(shí)元素看作一個(gè)對(duì)象---它有自己的名稱和屬性。 

    XML創(chuàng)建了標(biāo)識(shí),而DOM的作用就是告訴script如何在瀏覽器窗口中操作和顯示這些標(biāo)識(shí) 

    上面我們已經(jīng)簡(jiǎn)要的講述了一些XML的基本原理,我們來(lái)看看它們之間的關(guān)聯(lián)以及它們是如何工作的,先看這里一張圖:


    此主題相關(guān)圖片如下:

    1.XML描述數(shù)據(jù)類型。例如:"King lear"是一個(gè)標(biāo)題元素; 
    2.CSS儲(chǔ)存并控制元素的顯示樣式。例如:標(biāo)題將被以18pt字體顯示 
    3.script腳本控制元素如何動(dòng)作。例如:當(dāng)一個(gè)title元素"out of stock",將被用紅色顯示。 
    4.DOM則為腳本和對(duì)象的交流提供一個(gè)公共平臺(tái),并將結(jié)果顯示在瀏覽器窗口。 

    如果任何一個(gè)部分發(fā)生錯(cuò)誤,都不會(huì)得到正確結(jié)果。 

    好了,看到這里,我們已經(jīng)對(duì)XML是如何工作的有一個(gè)整體的大致的概念。通過(guò)這一章的學(xué)習(xí),我們可能感覺到XML似乎更偏向數(shù)據(jù)處理,更方便程序員學(xué)習(xí)。實(shí)際情況也是這樣的,XML設(shè)計(jì)的目的就是用來(lái)方便的共享和交互數(shù)據(jù)的。下一章,我們將系統(tǒng)的了解關(guān)于XML的各種術(shù)語(yǔ)。歡迎您繼續(xù)瀏覽。

    XML輕松學(xué)習(xí)手冊(cè)(3)XML的術(shù)語(yǔ)

    第三章 XML的術(shù)語(yǔ)

    提綱: 


    導(dǎo)言 

    一.XML文檔的有關(guān)術(shù)語(yǔ) 

    二.DTD的有關(guān)術(shù)語(yǔ) 

    導(dǎo)言 


    初學(xué)XML最令人頭疼的就是有一大堆新的術(shù)語(yǔ)概念要理解。由于XML本身也是一個(gè)嶄新的技術(shù),正在不斷發(fā)展和變化,各組織和各大網(wǎng)絡(luò)公司(微軟,IBM,SUN等)都在不斷推出自己的見解和標(biāo)準(zhǔn),因此新概念漫天飛就不足為奇了。而國(guó)內(nèi)又缺乏權(quán)威的機(jī)構(gòu)或組織來(lái)對(duì)這些術(shù)語(yǔ)正式定名,你所看見的有關(guān)XML的中文教材大部分是靠作者本身的理解翻譯過(guò)來(lái)的,有些是正確的,有些是錯(cuò)誤的,更加妨礙了我們對(duì)這些概念的理解和學(xué)習(xí)。 

    你下面將要看到的關(guān)于XML術(shù)語(yǔ)的解釋,也是作者本身的理解和翻譯。阿捷是以W3C組織發(fā)布的XML1.0標(biāo)準(zhǔn)規(guī)范和相關(guān)的正式說(shuō)明文檔為根據(jù)來(lái)講述。可以確保這些理解是基本正確的,至少不是錯(cuò)誤的。你如果想進(jìn)一步閱讀和了解,我在本文的最后部分列明了相關(guān)資源的出處和鏈接,你可以直接訪問(wèn)。好,我們轉(zhuǎn)入正題:

    一.XML文檔的有關(guān)術(shù)語(yǔ)

    什么是XML文檔?知道HTML原代碼文件吧,XML文檔就是用XML標(biāo)識(shí)寫的XML原代碼文件。XML文檔也是ASCII的純文本文件,你可以用Notepad創(chuàng)建和修改。XML文檔的后綴名為.XML,例如myfile.xml。用IE5.0以上瀏覽器也可以直接打開.xml文件,但你看到的就是"XML原代碼",而不會(huì)顯示頁(yè)面內(nèi)容。你可以將下面代碼存為myfile.xml試試:


    <?xml version="1.0" encoding="GB2312"?>

    <myfile>

    <title>XML輕松學(xué)習(xí)手冊(cè)</title>

    <author>ajie</author>

    <email>ajie@aolhoo.com</email>

    <date>20010115</date>

    </myfile>


    XML文檔包含三個(gè)部分:

    1. 一個(gè)XML文檔聲明;

    2. 一個(gè)關(guān)于文檔類型的定義;

    3. 用XML標(biāo)識(shí)創(chuàng)建的內(nèi)容。


    舉例說(shuō)明:

    <?xml version="1.0"?>

    <!DOCTYPE filelist SYSTEM "filelist.dtd">

    <filelist> 

    <myfile>

    <title>QUICK START OF XML</title>

    <author>ajie</author>

    </myfile>

    ......

    </filelist> 

    其中第一行<?xml version="1.0"?>就是一個(gè)XML文檔的聲明,第二行說(shuō)明這個(gè)文檔是用filelist.dtd來(lái)定義文檔類型的,第三行以下就是內(nèi)容主體部分。 
    我們來(lái)了解XML文檔中有關(guān)的術(shù)語(yǔ):


    1.Element(元素):

    元素在HTML我們已經(jīng)有所了解,它是組成HTML文檔的最小單位,在XML中也一樣。一個(gè)元素由一個(gè)標(biāo)識(shí)來(lái)定義,包括開始和結(jié)束標(biāo)識(shí)以及其中的內(nèi)容,就象這樣:<author>ajie</author> 


    唯一不同的就是:在HTML中,標(biāo)識(shí)是固定的,而在XML中,標(biāo)識(shí)需要你自己創(chuàng)建。


    2.Tag(標(biāo)識(shí)) 

    標(biāo)識(shí)是用來(lái)定義元素的。在XML中,標(biāo)識(shí)必須成對(duì)出現(xiàn),將數(shù)據(jù)包圍在中間。標(biāo)識(shí)的名稱和元素的名稱是一樣的。例如這樣一個(gè)元素:

    <author>ajie</author> 

    其中<author>就是標(biāo)識(shí)。


    3.Attribute(屬性): 

    什么是屬性?看這段HTML代碼:<font color="red">word</font>。其中color就是font的屬性之一。

    屬性是對(duì)標(biāo)識(shí)進(jìn)一步的描述和說(shuō)明,一個(gè)標(biāo)識(shí)可以有多個(gè)屬性,例如font的屬性還有size。XML中的屬性與HTML中的屬性是一樣的,每個(gè)屬性都有它自己的名字和數(shù)值,屬性是標(biāo)識(shí)的一部分。舉例:

    <author sex="female">ajie</author>

    XML中屬性也是自己定義的,我們建議你盡量不使用屬性,而將屬性改成子元素,例如上面的代碼可以改成這樣:

    <author>ajie

    <sex>female</sex>

    </author>

    原因是屬性不易擴(kuò)充和被程序操作。


    4.Declaration(聲明) 

    在所有XML文檔的第一行都有一個(gè)XML聲明。這個(gè)聲明表示這個(gè)文檔是一個(gè)XML文檔,它遵循的是哪個(gè)XML版本的規(guī)范。一個(gè)XML的聲明語(yǔ)句就象這樣:

    <?xml version="1.0"?> 


    5.DTD(文件類型定義) 

    DTD是用來(lái)定義XML文檔中元素,屬性以及元素之間關(guān)系的。

    通過(guò)DTD文件可以檢測(cè)XML文檔的結(jié)構(gòu)是否正確。但建立XML文檔并不一定需要DTD文件。關(guān)于DTD文件的詳細(xì)說(shuō)明我們將在下面單獨(dú)列項(xiàng)。


    6.Well-formed XML(良好格式的XML)

    一個(gè)遵守XML語(yǔ)法規(guī)則,并遵守XML規(guī)范的文檔稱之為"良好格式"。如果你所有的標(biāo)識(shí)都嚴(yán)格遵守XML規(guī)范,那么你的XML文檔就不一定需要DTD文件來(lái)定義它。

    良好格式的文檔必須以一個(gè)XML聲明開始,例如:

    <?xml version="1.0" standalone="yes" encoding="UTF-8"?>

    其中你必須說(shuō)明文檔遵守的XML版本,目前是1.0;其次說(shuō)明文檔是"獨(dú)立的",它不需要DTD文件來(lái)驗(yàn)證其中的標(biāo)識(shí)是否有效;第三,要說(shuō)明文檔所使用的語(yǔ)言編碼。默認(rèn)的是UTF-8,如果使用中文,你需要設(shè)置為GB2312。

    良好格式的XML文檔必須有一個(gè)根元素,就是緊接著聲明后面建立的第一個(gè)元素,其它元素都是這個(gè)根元素的子元素,屬于根元素一組。

    良好格式的XML文檔的內(nèi)容書寫時(shí)必須遵守XML語(yǔ)法。(有關(guān)XML語(yǔ)法我們將在下一章仔細(xì)講解)


    7.Valid XML(有效的XML)

    一個(gè)遵守XML語(yǔ)法規(guī)則,并遵守相應(yīng)DTD文件規(guī)范的XML文檔稱為有效的XML文檔。注意我們比較"Well-formed XML"和"Valid 
    XML",它們最大的差別在于一個(gè)完全遵守XML規(guī)范,一個(gè)則有自己的"文件類型定義(DTD)"。

    將XML文檔和它的DTD文件進(jìn)行比較分析,看是否符合DTD規(guī)則的過(guò)程叫validation(確認(rèn))。這樣的過(guò)程通常我們是通過(guò)一個(gè)名為parser的軟件來(lái)處理的。

    有效的XML文檔也必須以一個(gè)XML聲明開始,例如:

    <?xml version="1.0" standalone="no" encode="UTF-8"?>

    和上面例子不同的,在standalone(獨(dú)立)屬性中,這里設(shè)置的是"no",因?yàn)樗仨毢拖鄳?yīng)的DTD一起使用,DTD文件的定義方法如下:

    <!DOCTYPE type-of-doc SYSTEM/PUBLIC "dtd-name"> 

    其中:

    "!DOCTYPE"是指你要定義一個(gè)DOCTYPE;

    "type-of-doc"是文檔類型的名稱,由你自己定義,通常于DTD文件名相同;

    "SYSTEM/PUBLIC"這兩個(gè)參數(shù)只用其一。SYSTEM是指文檔使用的私有DTD文件的網(wǎng)址,而PUBLIC則指文檔調(diào)用一個(gè)公用的DTD文件的網(wǎng)址。

    "dtd-name" 就是DTD文件的網(wǎng)址和名稱。所有DTD文件的后綴名為".dtd"。

    我們還是用上面的例子,應(yīng)該寫成這樣:

    <?xml version="1.0" standalone="no" encode="UTF-8"?>

    <!DOCTYPE filelist SYSTEM "filelist.dtd"> 

    二.DTD的有關(guān)術(shù)語(yǔ)

    什么是DTD,我們上面已經(jīng)簡(jiǎn)略提到。DTD是一種保證XML文檔格式正確的有效方法,可以比較XML文檔和DTD文件來(lái)看文檔是否符合規(guī)范,元素和標(biāo)簽使用是否正確。一個(gè)DTD文檔包含:元素的定義規(guī)則,元素間關(guān)系的定義規(guī)則,元素可使用的屬性,可使用的實(shí)體或符號(hào)規(guī)則。

    DTD文件也是一個(gè)ASCII的文本文件,后綴名為.dtd。例如:myfile.dtd。

    為什么要用DTD文件呢?我的理解是它滿足了網(wǎng)絡(luò)共享和數(shù)據(jù)交互,使用DTD最大的好處在于DTD文件的共享。(就是上文DTD說(shuō)明語(yǔ)句中的PUBLIC屬性)。比如,兩個(gè)相同行業(yè)不同地區(qū)的人使用同一個(gè)DTD文件來(lái)作為文檔創(chuàng)建規(guī)范,那么他們的數(shù)據(jù)就很容易交換和共享。網(wǎng)上有其他人想補(bǔ)充數(shù)據(jù),也只需要根據(jù)公用的DTD規(guī)范來(lái)建立文檔,就立刻可以加入。

    目前,已經(jīng)有數(shù)量眾多的寫好的DTD文件可以利用。針對(duì)不同的行業(yè)和應(yīng)用,這些DTD文件已經(jīng)建立了通用的元素和標(biāo)簽規(guī)則。你不需要自己重新創(chuàng)建,只要在他們的基礎(chǔ)上加入你需要的新標(biāo)識(shí)。

    當(dāng)然,如果愿意,你可以創(chuàng)建自己的DTD,它可能和你的文檔配合的更加完美。建立自己的DTD也是很簡(jiǎn)單的一件事,一般只需要定義4-5個(gè)元素就可以了。

    調(diào)用DTD文件的方法有兩種:

    1.直接包含在XML文檔內(nèi)的DTD

    你只要在DOCTYPE聲明中插入一些特別的說(shuō)明就可以了,象這樣: 

    我們有一個(gè)XML文檔:

    <?xml version="1.0" encoding="GB2312"?>

    <myfile>

    <title>XML輕松學(xué)習(xí)手冊(cè)</title>

    <author>ajie</author>

    </myfile>

    我們?cè)诘谝恍泻竺娌迦胂旅娲a就可以:

    <!DOCTYPE myfile [

    <!ELEMENT title (#PCDATA)>

    <!ELEMENT author (#PCDATA)>

    <!ENTITY copyright "Copyright 2001, Ajie.">

    ]>
     

    2.調(diào)用獨(dú)立的DTD文件

    將DTD文檔存為.dtd的文件,然后在DOCTYPE聲明行中調(diào)用,例如,將下面的代碼存為myfile.dtd

    <!ELEMENT myfile (title, author)>

    <!ELEMENT title (#PCDATA)>

    <!ELEMENT author (#PCDATA)>
     

    然后在XML文檔中調(diào)用,在第一行后插入:

    <!DOCTYPE myfile SYSTEM "myfile.dtd">
     

    我們可以看到DTD文檔和HTML中js的調(diào)用是差不多的,關(guān)于DTD文檔具體如何寫,我們將在下一章和XML文檔的語(yǔ)法一起介紹。 


    下面我們來(lái)了解DTD有關(guān)的術(shù)語(yǔ):

    1.Schema(規(guī)劃) 

    schema是數(shù)據(jù)規(guī)則的描述。schema做兩件事:

    a.它定義元素?cái)?shù)據(jù)類型和元素之間的關(guān)系;

    b.它定義元素所能包含的內(nèi)容類型。

    DTD就是關(guān)于XML文檔的一個(gè)schema。

    2.Document Tree(文檔樹) 

    "文檔樹"在前面第二章我們已經(jīng)提到過(guò),它是文檔元素分級(jí)結(jié)構(gòu)的形象表示。一個(gè)文檔結(jié)構(gòu)樹包含根元素,根元素是最頂級(jí)的元素,(就是緊接著XML聲明語(yǔ)句后的第一個(gè)元素)。看例子:

    <?xml version="1.0"?>

    <filelist> 

    <myfile>

    <title>...</title>

    <author>...</author>

    </myfile>

    </filelist>

    上面的例子分三級(jí)結(jié)構(gòu)排列成"樹"狀,其中的<filelist>就是根元素。在XML和DTD文件中,第一個(gè)定義的都是根元素。
     

    3.Parent Element(父元素)/Child Element(子元素)

    父元素是指包含有其它元素的元素,被包含的元素稱為它的子元素。看上面的"結(jié)構(gòu)樹",其中<myfile>是父元素,<title>,<author>是它的子元素,而<myfile>又是<filelist>的子元素。象<title>這樣沒(méi)有包含任何子元素的最后一級(jí)元素我們也稱之為"頁(yè)元素"。
    4.Parser(解析軟件) 

    Parser是一種檢查XML文檔是否遵循DTD規(guī)范的工具軟件。

    XML的parser發(fā)展為兩類:一種是"非確認(rèn)類paeser",只檢測(cè)文檔是否遵守XML語(yǔ)法規(guī)則,是否用元素標(biāo)識(shí)建立了文檔樹。另一種是"確認(rèn)類paeser",它不但檢測(cè)文檔語(yǔ)法,結(jié)構(gòu)樹,而且比較解析你使用的元素標(biāo)識(shí)是否遵守了相應(yīng)DTD文件的規(guī)范。

    Parser能獨(dú)立使用,也可以成為編輯軟件或?yàn)g覽器的一部分。在后面的相關(guān)資源列表里,我列出了當(dāng)前比較流行的一些parsers。


      好了,通過(guò)第三章的學(xué)習(xí),我們已經(jīng)了解了一些XML和DTD的基本術(shù)語(yǔ),但是我們還不知道怎樣來(lái)寫這些文件,需要遵循什么樣的語(yǔ)法,在下一章,將重點(diǎn)介紹有關(guān)撰寫XML和DTD文檔的語(yǔ)法。請(qǐng)繼續(xù)瀏覽,謝謝!

    XML輕松學(xué)習(xí)手冊(cè)(4)XML語(yǔ)法

    第四章 XML語(yǔ)法 

    提綱: 

    一.XML語(yǔ)法規(guī)則 
    二.元素的語(yǔ)法 
    三.注釋的語(yǔ)法 
    四.CDATA的語(yǔ)法 
    五.Namespaces的語(yǔ)法 
    六.entity的語(yǔ)法 
    七.DTD的語(yǔ)法 

    通過(guò)前面三章的學(xué)習(xí),我們已經(jīng)對(duì)什么是XML,它的實(shí)現(xiàn)原理以及相關(guān)的術(shù)語(yǔ)有所了解。接下來(lái)我們就開始學(xué)習(xí)XML的語(yǔ)法規(guī)范,動(dòng)手寫自己的XML文檔。

    一.XML語(yǔ)法規(guī)則

    XML的文檔和HTML的原代碼類似,也是用標(biāo)識(shí)來(lái)標(biāo)識(shí)內(nèi)容。創(chuàng)建XML文檔必須遵守下列重要規(guī)則:
    規(guī)則1:必須有XML聲明語(yǔ)句
    這一點(diǎn)我們?cè)谏弦徽聦W(xué)習(xí)時(shí)已經(jīng)提到過(guò)。聲明是XML文檔的第一句,其格式如下:
    <?xml version="1.0" standalone="yes/no" encoding="UTF-8"?> 
    聲明的作用是告訴瀏覽器或者其它處理程序:這個(gè)文檔是XML文檔。聲明語(yǔ)句中的version表示文檔遵守的XML規(guī)范的版本;standalone表示文檔是否附帶DTD文件,如果有,參數(shù)為no;encoding表示文檔所用的語(yǔ)言編碼,默認(rèn)是UTF-8。

    規(guī)則2:是否有DTD文件
    如果文檔是一個(gè)"有效的XML文檔"(見上一章),那么文檔一定要有相應(yīng)DTD文件,并且嚴(yán)格遵守DTD文件制定的規(guī)范。DTD文件的聲明語(yǔ)句緊跟在XML聲明語(yǔ)句后面,格式如下:
    <!DOCTYPE type-of-doc SYSTEM/PUBLIC "dtd-name"> 
    其中:
    "!DOCTYPE"是指你要定義一個(gè)DOCTYPE;
    "type-of-doc"是文檔類型的名稱,由你自己定義,通常于DTD文件名相同;
    "SYSTEM/PUBLIC"這兩個(gè)參數(shù)只用其一。SYSTEM是指文檔使用的私有DTD文件的網(wǎng)址,而PUBLIC則指文檔調(diào)用一個(gè)公用的DTD文件的網(wǎng)址。
    "dtd-name" 就是DTD文件的網(wǎng)址和名稱。所有DTD文件的后綴名為".dtd"。
    我們還是用上面的例子,應(yīng)該寫成這樣:
    <?xml version="1.0" standalone="no" encode="UTF-8"?>
    <!DOCTYPE filelist SYSTEM "filelist.dtd">

    規(guī)則3:注意你的大小寫
    在XML文檔中,大小寫是有區(qū)別的。<P>和<p>是不同的標(biāo)識(shí)。注意在寫元素時(shí),前后標(biāo)識(shí)大小寫要保持一樣。例如:<Author>ajie</Author>,寫成<Author>ajie</author>是錯(cuò)誤的。
    你最好養(yǎng)成一種習(xí)慣,或者全部大寫,或者全部小寫,或者大寫第一個(gè)字母。這樣可以減少因?yàn)榇笮懖黄ヅ洚a(chǎn)生的文檔錯(cuò)誤。

    規(guī)則4:給屬性值加引號(hào)
    在HTML代碼里面,屬性值可以加引號(hào),也可以不加。例如:<font color=red>word</font>和<font color="red">word</font>都可以被瀏覽器正確解釋。
    但是在XML中則規(guī)定,所有屬性值必須加引號(hào)(可以是單引號(hào),也可以是雙引號(hào)),否則將被視為錯(cuò)誤。

    規(guī)則5:所有的標(biāo)識(shí)必須有相應(yīng)的結(jié)束標(biāo)識(shí)
    在HTML中,標(biāo)識(shí)可能不是成對(duì)出現(xiàn)的,比?lt;br>。而在XML中規(guī)定,所有標(biāo)識(shí)必須成對(duì)出現(xiàn),有一個(gè)開始標(biāo)識(shí),就必須有一個(gè)結(jié)束標(biāo)識(shí)。否則將被視為錯(cuò)誤。

    規(guī)則6:所有的空標(biāo)識(shí)也必須被關(guān)閉
    空標(biāo)識(shí)就是標(biāo)識(shí)對(duì)之間沒(méi)有內(nèi)容的標(biāo)識(shí)。比如
    ,<img>等標(biāo)識(shí)。在XML中,規(guī)定所有的標(biāo)識(shí)必須有結(jié)束標(biāo)識(shí),針對(duì)這樣的空標(biāo)識(shí),XML中處理的方法是在原標(biāo)識(shí)最后加/,就可以了。例如:

    應(yīng)寫為<br />;
    <META name="keywords" content="XML, SGML, HTML">應(yīng)寫為<META name="keywords" content="XML, SGML, HTML" />;
    <IMG src= "cool.gif">應(yīng)寫為<IMG src= "cool.gif" /> 


    第四章 XML語(yǔ)法

    二.元素的語(yǔ)法 

    元素由一對(duì)標(biāo)識(shí)以及其中的內(nèi)容組成。就象這樣:ajie。元素的名稱和標(biāo)識(shí)的名稱是一樣的。標(biāo)識(shí)可以用屬性來(lái)進(jìn)一步描述。 

    在XML中,沒(méi)有任何保留字,所以你可以隨心所欲的用任何詞語(yǔ)來(lái)作為元素名稱。但是也必須遵守下列規(guī)范: 

    1.名稱中可以包含字母、數(shù)字以及其它字母; 

    2.名稱不能以數(shù)字或"_" (下劃線)開頭; 

    3.名稱不能以字母 xml(或 XML 或 Xml ..)開頭 

    4.名稱中不能包含空格 

    5.名稱中間不能包含":"(冒號(hào)) 

    為了使元素更容易閱讀理解和操作,我們還有一些建議: 

    1.名稱中不要使用"."。因?yàn)樵诤芏喑绦蛘Z(yǔ)言中,"."是作為對(duì)象的屬性,例如:font.color。同樣的原因"-"也最好不要用,必須使用的,以"_"代替; 

    2.名稱盡量簡(jiǎn)短。 

    3.名稱的大小寫盡量采用同一標(biāo)準(zhǔn)。 

    4.名稱可以使用非英文字符,比如用中文。但是有些軟件可能不支持。(IE5目前是支持中文元素的。) 

    另外,補(bǔ)充一點(diǎn)關(guān)于屬性的說(shuō)明。在HTML中,屬性可以用來(lái)定義元素的顯示格式,比如:<font color="red">word</font>將把word顯示為紅色。而在XML中,屬性只是對(duì)標(biāo)識(shí)的描述,與元素內(nèi)容的顯示無(wú)關(guān)。例如同樣一句:<font color="red">word</font>,并不會(huì)將word顯示為紅色。(那么,有網(wǎng)友會(huì)問(wèn):如何在XML中將文字顯示為紅色呢?這就需要使用CSS或者XSL,我們?cè)谙旅嬖敿?xì)講述。) 

    三.注釋的語(yǔ)法 

    注釋是為了便于閱讀和理解,在XML文檔添加的附加信息,將不會(huì)被程序解釋或則瀏覽器顯示。 

    注釋的語(yǔ)法如下: 

    <!-- 這里是注釋信息 --> 

    可以看到,它和HTML中的注釋語(yǔ)法是一樣的,非常容易。養(yǎng)成良好的注釋習(xí)慣將使你的文檔更加便于維護(hù),共享,看起來(lái)也更專業(yè)。 

    四.CDATA的語(yǔ)法 

    CDATA全稱character data,翻譯為字符數(shù)據(jù)。我們?cè)趯慩ML文檔時(shí),有時(shí)需要顯示字母,數(shù)字和其它的符號(hào)本身,比如"<",而在XML中,這些字符已經(jīng)有特殊的含義,我們?cè)趺崔k呢?這就需要用到CDATA語(yǔ)法。語(yǔ)法格式如下: 

    <![CDATA[這里放置需要顯示的字符]]> 

    例如: 

    <![CDATA[<AUTHOR sex="female">ajie</AUTHOR>]]> 

    在頁(yè)面上顯示的內(nèi)容將是"<AUTHOR sex="female">ajie</AUTHOR>" 


    第四章 XML語(yǔ)法

    五.Namespaces的語(yǔ)法 

    Namespaces翻譯為名字空間。名字空間有什么作用呢?當(dāng)我們?cè)谝粋€(gè)XML文檔中使用他人的或者多個(gè)DTD文件,就會(huì)出現(xiàn)這樣的矛盾:因?yàn)閄ML中標(biāo)識(shí)都是自己創(chuàng)建的,在不同的DTD文件中,標(biāo)識(shí)名可能相同但表示的含義不同,這就可能引起數(shù)據(jù)混亂。
    比如在一個(gè)文檔<table>wood table</table>中<table>表示桌子,
    而在另一個(gè)文檔<table>namelist</table>中<table>表示表格。如果我需要同時(shí)處理這兩個(gè)文檔,就會(huì)發(fā)生名字沖突。
    了解決這個(gè)問(wèn)題,我們引進(jìn)了namespaces這個(gè)概念。namespaces通過(guò)給標(biāo)識(shí)名稱加一個(gè)網(wǎng)址(URL)定位的方法來(lái)區(qū)別這些名稱相同的標(biāo)識(shí)。 
    Namespaces同樣需要在XML文檔的開頭部分聲明,聲明的語(yǔ)法如下:
    <document xmlns:yourname='URL'>
    其中yourname是由你定義的namespaces的名稱,URL就是名字空間的網(wǎng)址。
    假設(shè)上面的"桌子<table>"文檔來(lái)自http://www.zhuozi.com,我們就可以聲明為
    <document xmlns:zhuozi='http://www.zhuozi.com&#39;> 
    然后在后面的標(biāo)識(shí)中使用定義好的名字空間:
    <zhuozi:table>wood table</table>
    這樣就將這兩個(gè)<table>區(qū)分開來(lái)。注意的是:設(shè)置URL并不是說(shuō)這個(gè)標(biāo)識(shí)真的要到那個(gè)網(wǎng)址去讀取,僅僅作為一種區(qū)別的標(biāo)志而已。

    六.entity的語(yǔ)法

    entity翻譯為"實(shí)體"。它的作用類似word中的"宏",也可以理解為DW中的摸板,你可以預(yù)先定義一個(gè)entity,然后在一個(gè)文檔中多次調(diào)用,或者在多個(gè)文檔中調(diào)用同一個(gè)entity。
    entity可以包含字符,文字等等,使用entity的好處在于:1.它可以減少差錯(cuò),文檔中多個(gè)相同的部分只需要輸入一遍就可以了。2.它提高維護(hù)效率。比如你有40個(gè)文檔都包含copyright的entity,如果需要修改這個(gè)copyright,不需要所有的文件都修改,只要改最初定義的entity語(yǔ)句就可以了。
    XML定義了兩種類型的entity。一種是我們這里說(shuō)的普通entity,在XML文檔中使用;另一種是參數(shù)entity,在DTD文件中使用。
    entity的定義語(yǔ)法為:
    <!DOCTYPE filename [
    <!ENTITY entity-name "entity-content"
    ]
    >
    例如我要定義一段版權(quán)信息:
    <!DOCTYPE copyright [
    <!ENTITY copyright "Copyright 2001, Ajie. All rights reserved"
    ]
    >
    如果我的版權(quán)信息內(nèi)容和他人共享一個(gè)XML文件,也可以使用外部調(diào)用的方法,語(yǔ)法象這樣:
    <!DOCTYPE copyright [
    <!ENTITY copyright SYSTEM "http://www.sample.com/copyright.xml"> 
    ]
    >
    定義好的entity在文檔中的引用語(yǔ)法為:&entity-name;
    例如,上面定義的版權(quán)信息,調(diào)用時(shí)寫作?copyright;
    完整的例子如下,你可以copy下來(lái)存為copyright.xml觀看實(shí)例:
    <?xml version="1.0" encoding="GB2312"?>
    <!DOCTYPE copyright [
    <!ENTITY copyright "Copyright 2001, Ajie. All rights reserved">
    ]>
    <myfile>
    <title>XML</title>
    <author>ajie</author>
    <email>ajie@aolhoo.com</email>
    <date>20010115</date>
    ?right;
    </myfile> 


    第四章 XML語(yǔ)法

    七.DTD的語(yǔ)法 

    DTD是"有效XML文檔"的必須文件,我們通過(guò)DTD文件來(lái)定義文檔中元素和標(biāo)識(shí)的規(guī)則及相互關(guān)系。如何建立一個(gè)DTD文件呢?讓我們一起來(lái)學(xué)習(xí): 

    1.設(shè)置元素 

    元素是XML文檔的基本組成部分。你要在DTD中定義一個(gè)元素,然后在XML文檔中使用。元素的定義語(yǔ)法為:<!ELEMENT DESCRIPTION (#PCDATA, DEFINITION)*> 

    說(shuō)明: 

    "<!ELEMENT" 是元素的聲明,說(shuō)明你要定義的是一個(gè)元素; 

    聲明后面的"DESCRIPTION",是元素的名稱; 

    "(#PCDATA, DEFINITION)*>"則是該元素的使用規(guī)則。規(guī)則定義了元素可以包含的內(nèi)容以及相互的關(guān)系。下面的表格概要列出了元素的規(guī)則: 

    2.元素規(guī)則表: 


    此主題相關(guān)圖片如下:

    另外,我們還可以為元素定義屬性,因?yàn)槲覀儾煌扑]使用屬性,在這里就不詳細(xì)展開了。

     最后,我們來(lái)總結(jié)一些前四章學(xué)習(xí)的內(nèi)容,寫一個(gè)包含DTD,XML,以及Script的簡(jiǎn)單實(shí)例,便于讀者理解:
    1.將下面文件存為myfile.dtd
    <!ELEMENT myfile (title, author)>
    <!ELEMENT title (#PCDATA)>
    <!ELEMENT author (#PCDATA)>

    2.然后建立XML文檔myfile.xml:
    <?xml version="1.0" encoding="GB2312"?>
    <!DOCTYPE myfile SYSTEM "myfile.dtd">
    <myfile>
    <title>XML輕松學(xué)習(xí)手冊(cè)</title>
    <author>ajie</author>
    </myfile>

    3.建立HTML文檔myfile.html
    <html>
    <head>
    <script language="javascript" for="window" event="onload">
    var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
    xmlDoc.async="false";
    xmlDoc.load("myfile.xml");
    nodes = xmlDoc.documentElement.childNodes;
    title.innerText = nodes.item(0).text;
    author.innerText = nodes.item(1).text;
    </script>
    <title>在HTML中調(diào)用XML數(shù)據(jù)</title>
    </head>
    <body bgcolor="#FFFFFF">
    <b>標(biāo)題: </b>
    <span id="title"></span><br>
    <b>作者: </b>
    <span id="author"></span><br>
    </body>
    </html>

    4.用IE5.0以上瀏覽器打開myfile.html就可以看到效果了。

    XML輕松學(xué)習(xí)手冊(cè)(5)XML實(shí)例解析

    第五章:XML實(shí)例解析 

    提綱: 

    一:實(shí)例效果 

    二:實(shí)例解析 
      1.定義新標(biāo)識(shí)。
      2.建立XML文檔。
      3.建立相應(yīng)的HTML文件。 

    XML在不同領(lǐng)域有著廣泛的應(yīng)用,比如在科技領(lǐng)域的MathML,無(wú)線通信應(yīng)用的WML,在網(wǎng)絡(luò)圖象方面的SVG等等,我們這里側(cè)重討論XML在web上的應(yīng)用。XML在web上應(yīng)用主要是利用其強(qiáng)大的數(shù)據(jù)操作能力。一般用XML配合javascript和asp等服務(wù)器端程序,可以實(shí)現(xiàn)網(wǎng)絡(luò)上幾乎所有的應(yīng)用需求。 

    考慮講解方便,我們?cè)谙旅娼榻B一個(gè)簡(jiǎn)單的實(shí)例,不包含服務(wù)器端程序。目的在于讓您對(duì)XML的數(shù)據(jù)操作能力有一個(gè)感性的認(rèn)識(shí)。 

    好,我們首先[ 點(diǎn)擊這里 ]來(lái)看實(shí)例的效果。(請(qǐng)用IE5.0以上版本瀏覽器打開) 

    這是一個(gè)簡(jiǎn)單的CD唱片數(shù)據(jù)檢索功能。你通過(guò)點(diǎn)擊"上一張","下一張"可以看到單張CD的有關(guān)信息。這樣的效果我們?cè)瓉?lái)用兩種方法可以實(shí)現(xiàn): 

    1.利用DHTML,將數(shù)據(jù)隱藏在不同的層中,通過(guò)鼠標(biāo)事件依次顯示; 

    2.利用后臺(tái)程序(如ASP,CGI,PHP,JSP等),調(diào)用服務(wù)器端的數(shù)據(jù)。 

    但是在這個(gè)實(shí)例中,我們打開頁(yè)面原代碼可以看到,其中沒(méi)有用DHTML的DIV,也沒(méi)有表單的action,它完全是用XML來(lái)實(shí)現(xiàn)的。下面我們來(lái)分析它的制作過(guò)程:

    第一步:定義新標(biāo)識(shí)。
    根據(jù)實(shí)際的CD數(shù)據(jù),首先新建一個(gè)名為<CD>的標(biāo)識(shí);其次建立它相關(guān)的數(shù)據(jù)標(biāo)識(shí),分別是:CD名稱<Title>,演唱者<Artist>,出版年代<Year>,國(guó)家<Country>,發(fā)行公司<Company>和價(jià)格<Price>;最后還要建立一個(gè)名為目錄<CATALOG>的標(biāo)識(shí)。為什么要再建立一個(gè)<CATALOG>標(biāo)識(shí)呢?因?yàn)樵赬ML文檔中規(guī)定,必須且只能有一個(gè)根元素(標(biāo)識(shí)),我們有多個(gè)CD數(shù)據(jù),這些數(shù)據(jù)是并列的關(guān)系,所以需要為這些并列的元素建立一個(gè)根元素。
    以上元素的定義和關(guān)系都完全符合XML標(biāo)準(zhǔn),不需要特別的DTD文件來(lái)定義,所以可以省略DTD定義。如果我們想使用DTD來(lái)定義,以上過(guò)程可以表示為:

    <!ELEMENT CATALOG (CD)*>
    <!ELEMENT CD (Title,Artist,Year,Country,Company,Price)>
    <!ELEMENT Title (#PCDATA)>
    <!ELEMENT Artist (#PCDATA)>
    <!ELEMENT Year (#PCDATA)>
    <!ELEMENT Country (#PCDATA)>
    <!ELEMENT Company (#PCDATA)>
    <!ELEMENT Price (#PCDATA)>

    這段代碼表示:元素CATALOG包含多個(gè)CD子元素,而子元素CD又依次包含Title, Artist, Year, Country, Company, Price 六個(gè)子元素,它們的內(nèi)容都定義為文本(字符,數(shù)字,文本)。(注:具體的語(yǔ)法說(shuō)明可以看上一章關(guān)于DTD的介紹) 

    第二步:建立XML文檔。

    <?xml version="1.0"?>
    <CATALOG>
    <CD>
    <TITLE>Empire Burlesque</TITLE>
    <ARTIST>Bob Dylan</ARTIST>
    <COUNTRY>USA</COUNTRY>
    <COMPANY>Columbia</COMPANY>
    <PRICE>10.90</PRICE>
    <YEAR>1985</YEAR>
    </CD>
    <CD>
    <TITLE>Hide your heart</TITLE>
    <ARTIST>Bonnie Tylor</ARTIST>
    <COUNTRY>UK</COUNTRY>
    <COMPANY>CBS Records</COMPANY>
    <PRICE>9.90</PRICE>
    <YEAR>1988</YEAR>
    </CD>
    <CD>
    <TITLE>Greatest Hits</TITLE>
    <ARTIST>Dolly Parton</ARTIST>
    <COUNTRY>USA</COUNTRY>
    <COMPANY>RCA</COMPANY>
    <PRICE>9.90</PRICE>
    <YEAR>1982</YEAR>
    </CD>
    <CD>
    <TITLE>Still got the blues</TITLE>
    <ARTIST>Gary More</ARTIST>
    <COUNTRY>UK</COUNTRY>
    <COMPANY>Virgin redords</COMPANY>
    <PRICE>10.20</PRICE>
    <YEAR>1990</YEAR>
    </CD>
    <CD>
    <TITLE>Eros</TITLE>
    <ARTIST>Eros Ramazzotti</ARTIST>
    <COUNTRY>EU</COUNTRY>
    <COMPANY>BMG</COMPANY>
    <PRICE>9.90</PRICE>
    <YEAR>1997</YEAR>
    </CD>
    </CATALOG> 

    上面代碼首先用<?xml version="1.0"?>聲明語(yǔ)句表明這是一個(gè)XML文檔,它的格式遵守XML 1.0標(biāo)準(zhǔn)規(guī)范。然后是文檔內(nèi)容,結(jié)構(gòu)樹非常清晰:
    <CATALOG>
    <CD>
    ...... 
    </CD>
    <CD>
    ...... 
    </CD>

    </CATALOG>
    一共定義了5組數(shù)據(jù)。我們將上面的代碼存為cd.xml文件,以備調(diào)用。 


    第三步:建立相應(yīng)的HTML文件。
    1.導(dǎo)入XML數(shù)據(jù)。
    我們知道,目前流行的瀏覽器中,暫時(shí)只有微軟的IE5.0以上版本瀏覽器支持XML。IE是通過(guò)在HTML中的object物件來(lái)支持插入XML,并通過(guò)js的XMLDocument.load()方法來(lái)導(dǎo)入數(shù)據(jù)。我們看代碼: <object WIDTH="0" HEIGHT="0"
    CLASSID="clsid:550dda30-0541-11d2-9ca9-0060b0ec3d39" ID="xmldso">
    </object>

    定義一個(gè)object,ID名為xmldso。然后在head區(qū)用js引入xml數(shù)據(jù):

    <script for="window" event="onload">
    xmldso.XMLDocument.load("cd.xml");
    </script>

    2.捆綁數(shù)據(jù)。
    然后將用<SPAN>標(biāo)識(shí)來(lái)將XML數(shù)據(jù)綁定在表格中。其中ID,DATASRC,DTATFLD都是<SPAN>的屬性。代碼如下:

    <table>
    <tr><td>Title:</td><td><SPAN ID="title" DATASRC=#xmldso DATAFLD="TITLE"></SPAN></td></tr>
    <tr><td>Artist:</td><td><SPAN ID="artist" DATASRC=#xmldso DATAFLD="ARTIST"></SPAN></td></tr>
    <tr><td>Year:</td><td><SPAN ID="year" DATASRC=#xmldso DATAFLD="YEAR"></SPAN></td></tr>
    <tr><td>Country:</td><td><SPAN ID="country" DATASRC=#xmldso DATAFLD="COUNTRY"></SPAN></td></tr>
    <tr><td>Company:</td><td><SPAN ID="company" DATASRC=#xmldso DATAFLD="COMPANY"></SPAN></td></tr>
    <tr><td>Price:</td><td><SPAN ID="price" DATASRC=#xmldso DATAFLD="PRICE"></SPAN></td></tr>
    </table>

    3.動(dòng)作操作。
    最后,為數(shù)據(jù)提供瀏覽按鈕:
    <INPUT TYPE=button value="上一張CD" onCLICK="moveprevious()">
    <INPUT TYPE=button value="下一張CD" onCLICK="movenext()">

    并利用js來(lái)完成兩個(gè)鼠標(biāo)點(diǎn)擊功能:movenext()和moveprevious()。在head區(qū)加入如下代碼:

    <script language="javascript">
    function movenext()
    {
    if (xmldso.recordset.absoluteposition < xmldso.recordset.recordcount)
    {
    xmldso.recordset.movenext();
    }
    }
    function moveprevious()
    {
    if (xmldso.recordset.absoluteposition > 1)
    {
    xmldso.recordset.moveprevious();
    }
    }
    </script>

    好,我們先看HTML文件的全部原代碼:

    <html>
    <head>

    <script for="window" event="onload">
    xmldso.XMLDocument.load("cd.xml");
    </script>

    <script language="javascript">
    function movenext()
    {
    if (xmldso.recordset.absoluteposition < xmldso.recordset.recordcount)
    {
    xmldso.recordset.movenext();
    }
    }
    function moveprevious()
    {
    if (xmldso.recordset.absoluteposition > 1)
    {
    xmldso.recordset.moveprevious();
    }
    }
    </script>

    <TITLE>CD Navigate</TITLE>
    </head>

    <body>
    <p>
    <object WIDTH="0" HEIGHT="0"
    CLASSID="clsid:550dda30-0541-11d2-9ca9-0060b0ec3d39" ID="xmldso">
    </object>

    <table>
    <tr><td>Title:</td><td><SPAN ID="title" DATASRC=#xmldso DATAFLD="TITLE"></SPAN></td></tr>
    <tr><td>Artist:</td><td><SPAN ID="artist" DATASRC=#xmldso DATAFLD="ARTIST"></SPAN></td></tr>
    <tr><td>Year:</td><td><SPAN ID="year" DATASRC=#xmldso DATAFLD="YEAR"></SPAN></td></tr>
    <tr><td>Country:</td><td><SPAN ID="country" DATASRC=#xmldso DATAFLD="COUNTRY"></SPAN></td></tr>
    <tr><td>Company:</td><td><SPAN ID="company" DATASRC=#xmldso DATAFLD="COMPANY"></SPAN></td></tr>
    <tr><td>Price:</td><td><SPAN ID="price" DATASRC=#xmldso DATAFLD="PRICE"></SPAN></td></tr>
    </table>

    <p>
    <INPUT TYPE=button value="上一張CD" onCLICK="moveprevious()">
    <INPUT TYPE=button value="下一張CD" onCLICK="movenext()">
    </p>

    </body>
    </html>

    將以上代碼存為cd.htm文件,于第二步的cd.xml文件放在一起。打開cd.htm文件,你就看見和上面實(shí)例一樣的效果了。

    好,到今天為止,我們已經(jīng)學(xué)習(xí)了關(guān)于XML的不少知識(shí),我們來(lái)總結(jié)一下前面五個(gè)章節(jié),分別是XML快速入門,XML的概念原理,XML的術(shù)語(yǔ),XML的語(yǔ)法和本章的實(shí)例解析。到這里,教程部分就結(jié)束了。在寫作過(guò)程中,阿捷盡最大努力將有關(guān)XML概念講得通俗易懂,盡量把自己的理解告訴給大家,但因?yàn)楸救藢W(xué)習(xí)XML時(shí)間也不長(zhǎng),對(duì)整個(gè)XML的技術(shù)把握還不夠系統(tǒng)和深入,所以難免有疏漏的地方,請(qǐng)大家指正和諒解,謝謝!
    <完>

    posted @ 2006-01-05 19:46 Ben 閱讀(292) | 評(píng)論 (0)編輯 收藏

    金山詞霸2000使用密技兩則

    金山詞霸2000使用密技兩則

    loveaniu

        
     

      金山詞霸這么好的軟件相信大家都用過(guò)吧,可是小生在近日的使用過(guò)程中卻遇到了兩個(gè)棘手的問(wèn)題,經(jīng)過(guò)仔細(xì)分析,終于解決,呵呵,好東東當(dāng)然不能獨(dú)享,大家請(qǐng)看:

      (一)怎樣解決金山詞霸在win2000下不能正確顯示音標(biāo)的問(wèn)題。

      在win2000下裝過(guò)金山詞霸的朋友可能都有詞霸不能正確顯示單詞音標(biāo)的問(wèn)題,音標(biāo)在win2000下被顯示成了一堆亂碼,這可怎么辦呢,我抱著試一試的心理去到金山公司的技術(shù)支持那里看能不能找到解決辦法,金山的技術(shù)支持人員的回答:“出現(xiàn)這類問(wèn)題時(shí),可能是安裝出錯(cuò)或其他軟件的字體驅(qū)動(dòng)錯(cuò)誤,建議重新安裝詞霸2000;重裝后如果仍然出現(xiàn)問(wèn)題,則是由于安裝了過(guò)多的字體,請(qǐng)刪掉一些字體再安裝或重裝Windows系統(tǒng)”。看來(lái)只能自己試了,我的win2000里并未裝過(guò)任何其他的字體,應(yīng)該不會(huì)出現(xiàn)沖突這類事情,那么一定是金山詞霸無(wú)法調(diào)用自己的音標(biāo)字體而誤調(diào)用了WINGDING字體造成的,于是我便在金山詞霸的安裝目錄下開始找起來(lái),終于讓我找到了那個(gè)音標(biāo)字體——Ksphonet.ttf。呵呵,到這里就好解決了,我們只要把這個(gè)字體拷入win2000的fonts目錄下就ok了,再開你的詞霸試一試,是不是久違的音標(biāo)又出來(lái)了呢?

      (二)怎樣解決金山詞霸不能在Acrobat中取詞翻譯的問(wèn)題。

      許多朋友都希望能在看pdf文件時(shí)也能夠用金山詞霸的取詞功能,可是你可能會(huì)發(fā)現(xiàn)你的金山詞霸做不到,這可怎么辦呢?呵呵,小生獻(xiàn)上終極密技一條,包你隨指隨取隨譯,你就一邊爽著吧:)方法如下:首先去http://ciba.kingsoft.net/download/acrbatup.zip下載這個(gè)補(bǔ)丁,打開后有AcrUpdate.exe和XDICPI32.API 兩個(gè)文件,你所要做的只是運(yùn)行AcrUpdate.exe,然后按它所說(shuō)的一步一步做下去就行了,如果還是不行的話那就只好手工安裝了,找到你的Acrobat安裝目錄,將XDICPI32.API拷入其reader\plug_ins目錄下就行了。

    硅谷動(dòng)力eNet

    posted @ 2005-12-27 16:57 Ben 閱讀(291) | 評(píng)論 (0)編輯 收藏

    Java 技巧 101:applet 間通信的替代方法

    作者 Tobias Hill



    摘要
    您可能認(rèn)為能讓 applet 彼此通信的唯一選擇就是使用 getApplet。不幸的是,getApplet 方法僅返回與發(fā)出調(diào)用的 applet 在同一個(gè) HTML 頁(yè)面上的 applet,這樣就限制了您通過(guò) applet 間的通信構(gòu)建有趣界面的方式。這篇技巧說(shuō)明的替代方法能使處于不同框架甚至不同瀏覽器窗口中的 applet 彼此調(diào)用對(duì)方的方法。

    java.applet 包中的 AppletContext 類包含兩個(gè)成員方法,即 getApplet 和 getApplets。通過(guò)使用這兩個(gè)方法,一個(gè) applet 就可以找到其他 applet 并調(diào)用它們的方法。要這樣做必須滿足下面的安全要求:

  • 這些 applet 來(lái)自同一個(gè)服務(wù)器上的同一個(gè)目錄中。
  • 這些 applet 運(yùn)行于同一個(gè)瀏覽器窗口中的同一個(gè)頁(yè)面上。

    這樣設(shè)計(jì)安全限制可能有很好的原因;但是,后一個(gè)要求限制了利用 applet 間的通信制作有趣的多 applet 界面的方式。

    試考慮這樣一種情況:

    您剛編好一個(gè)很好的股票市場(chǎng)交易 applet,并決定為它編寫一個(gè)良好的幫助系統(tǒng)。您希望幫助系統(tǒng)也是一個(gè) applet,并希望將它與股票市場(chǎng)交易 applet 在不同的瀏覽器框架中運(yùn)行。您作出這個(gè)決定可能是出于網(wǎng)站結(jié)構(gòu)方面的考慮,也可能是出于始終顯示幫助系統(tǒng)的需要。另外,您希望使幫助系統(tǒng)根據(jù)用戶當(dāng)前在股票交易 applet 中進(jìn)行的操作轉(zhuǎn)至正確的信息/指導(dǎo)(就像 Microsoft Office 套件中的“回形針”一樣)。您甚至計(jì)劃在幫助系統(tǒng)中編制向?qū)В@些向?qū)Э蛇h(yuǎn)程指出問(wèn)題,并可遠(yuǎn)程執(zhí)行股票市場(chǎng)交易 applet 中的任務(wù)。

    這一方案中體現(xiàn)的思想很不錯(cuò)。但是,因?yàn)檫@兩個(gè) applet 處于不同的頁(yè)面上,所以 AppletContext 中的 Java API 無(wú)法幫助您實(shí)現(xiàn)這個(gè)想法 -- 但這篇技巧可以幫助您。


    使用 AppletContext API

    在說(shuō)明 applet 間通信的替代機(jī)制前,我將首先簡(jiǎn)要說(shuō)明一下 getApplet 和 getApplets 這兩個(gè)方法是如何工作的。一個(gè) applet 通過(guò)使用 getApplet 方法可以按名稱找到同一個(gè) HMTL 頁(yè)面中的另一個(gè) applet,而通過(guò)使用 getApplets 方法可以找到同一個(gè)頁(yè)面上的所有 applet。這兩個(gè)方法如果成功執(zhí)行,則會(huì)向調(diào)用者返回一個(gè)或多個(gè) Applet 對(duì)象。調(diào)用者一旦找到一個(gè) Applet 對(duì)象,它就可能調(diào)用這個(gè) Applet 的公用方法。

    假定有下面這樣一段 HTML 代碼:
    PHP代碼:
    <applet code="Applet1" width="400" height="100" name="app1">
    </
    applet>

    <
    applet code="Applet2" width="400" height="100" name="app2">
    </
    applet>

    通過(guò)使用 applet 標(biāo)記中的 name 屬性,您就可以用下面的方式引用一個(gè)特定的 applet:
    PHP代碼:
    Applet theOtherApplet = getApplet("app1");
    theOtherApplet.anyMethod(); //調(diào)用任一個(gè)公用方法

    或者,您也可以用以下的代碼來(lái)檢索這個(gè)頁(yè)面上的所有 applet:
    PHP代碼:
    Enumeration allAppletsOnSamePage = getApplets();
    while(
    allAppletsOnSamePage.hasMoreElements()) {
    Applet appl = (Applet) allAppletsOnSamePage.nextElement();
    appl.anyMethod(); //調(diào)用任一個(gè)公用方法
    }

    當(dāng)發(fā)出調(diào)用的 applet 在它所在的同一個(gè) HTML 頁(yè)面上檢索到一個(gè)或幾個(gè) applet 之后,它就可以調(diào)用這些 applet 的公用方法。

    使用靜態(tài)數(shù)據(jù)結(jié)構(gòu)

    不幸的是,如果使用標(biāo)準(zhǔn)方法,則只能與同一個(gè) HTML 頁(yè)面中的 applet 通信。幸運(yùn)的是,您很容易就可以避開這個(gè)限制。使 applet 間跨頁(yè)面通信的方法基于這樣一個(gè)事實(shí),即如果兩個(gè) applet 的 codebase 相同,則即使它們是在不同的瀏覽器窗口中被加載的,它們也共享同一個(gè)運(yùn)行時(shí)環(huán)境。粗略地說(shuō),codebase 就是從中加載 applet 的那個(gè)目錄。請(qǐng)參閱文后的參考資源,其中有一個(gè)鏈接指向有關(guān) codebase 的一篇教程。

    由于運(yùn)行時(shí)環(huán)境是共享的,因此所有 applet 實(shí)例都可以訪問(wèn)靜態(tài)域和靜態(tài)結(jié)構(gòu),這樣這些靜態(tài)域和結(jié)構(gòu)就可用來(lái)在不同 applet 之間傳遞信息。

    applet 不僅可以存儲(chǔ)諸如整數(shù)、字符和字符串這樣的簡(jiǎn)單數(shù)據(jù)類型,而且每個(gè) applet 都可以將其自身(實(shí)例)的一個(gè)引用存儲(chǔ)在一個(gè)靜態(tài)域(可能在它自己的類中)中。任何 applet 都可以訪問(wèn)這個(gè)域,從而獲得指向這個(gè)實(shí)例的引用。

    這聽起來(lái)復(fù)雜嗎?不,一點(diǎn)也不復(fù)雜。我首先舉一個(gè)簡(jiǎn)單的例子。假定您的一個(gè) applet (AppletA.class) 在一個(gè)框架中,而另一個(gè) applet (AppletB.class) 在另一個(gè)框架中,而且這兩個(gè) applet 都是從同一個(gè) codebase 加載的。

    您現(xiàn)在希望授予 AppletA 訪問(wèn) AppletB 的公用方法的權(quán)限。您必須讓 AppletB 將其自身的一個(gè)引用存儲(chǔ)在一個(gè)靜態(tài)公用域中,就像下面這樣:
    PHP代碼:
    public class AppletB {
    public static
    AppletB selfRef = null; // 初始?xì)w零

    public void init() {
    // 生成對(duì)該實(shí)例的引用
    selfRef = this;
    }
    ...
    }

    現(xiàn)在您就可以從 AppletA 訪問(wèn) AppletB 的實(shí)例了:
    PHP代碼:
    public class AppletA {
    AppletB theOtherApplet = null;

    public
    void callAppletB() {
    // 獲取靜態(tài)域,其中存儲(chǔ)著指向 AppletB 的
    // 實(shí)例的指針。
    theOtherApplet = AppletB.selfRef;

    // 此后就可以調(diào)用實(shí)例方法了,
    // 如下所示...
    theOtherApplet.repaint();
    }
    ...
    }

    這就是我們所要做的全部工作。因?yàn)檫\(yùn)行時(shí)環(huán)境是由不同的 applet 共享的,所以即便 applet 不在同一個(gè)頁(yè)面上,這個(gè)方法同樣奏效。

    值得注意的一點(diǎn)是,上面的代碼并沒(méi)有處理在啟動(dòng) AppletB 之前就調(diào)用 AppletA 中的 callAppletB 方法的情況。如果發(fā)生這種情況,則 selfRef 將是 null,這樣不能進(jìn)行任何通信。

    一種更通用的方法

    當(dāng)然,還有一種更通用的方法。您可以創(chuàng)建這樣一個(gè)類,創(chuàng)建它的唯一目的就是在靜態(tài)數(shù)據(jù)結(jié)構(gòu)中存儲(chǔ) applet 的引用。稍后您將看到的 AppletList 類就屬于這種情況。希望其他 applet 訪問(wèn)自己的公用方法的 applet 實(shí)例通過(guò) AppletList 將自己注冊(cè)。按照 AppletContext.getApplet(string name) 中的模式,每個(gè)注冊(cè)項(xiàng)都與一個(gè)字符串相關(guān)聯(lián)。當(dāng)一個(gè) applet 調(diào)用某個(gè) applet 的引用時(shí),這個(gè)字符串就起關(guān)鍵字的作用。

    通常,applet 是按下面的方式注冊(cè)的:
    PHP代碼:
    public class AppletA {
    public
    void start() {
    AppletList.register("Stock-trade-applet", this);
    ...
    }
    }

    另一個(gè) applet 獲取對(duì)它的訪問(wèn)權(quán):
    PHP代碼:
    public class AppletB {
    public
    void run() {
    AppletA tradeApplet =
    (
    AppletA) AppletList.getApplet("Stock-trade-applet");
    ...
    }
    }

    當(dāng)該 applet 停止運(yùn)行時(shí),您必須緊記在 AppletList 中撤銷注冊(cè):
    PHP代碼:
    public void stop() {
    AppletList.remove("Stock-trade-applet");
    ...
    }

    AppletList 類的完整源代碼如下所示:
    PHP代碼:
    0: import java.util.*;
    1: import java.applet.Applet;
    2:
    3: public class AppletList {
    4: private static Hashtable applets = new Hashtable();
    5:
    6: public static void register(String name, Applet applet) {
    7: applets.put(name,applet);
    8: }
    9:
    10: public static void remove(String name) {
    11: applets.remove(name);
    12: }
    13:
    14: public static Applet getApplet(String name) {
    15: return (Applet) applets.get(name);
    16: }
    17:
    18: public static Enumeration getApplets() {
    19: return applets.elements();
    20: }
    21:
    22: public static int size() {
    23: return applets.size();
    24: }
    25: }

    要獲得說(shuō)明如何使用這個(gè)類的示例,請(qǐng)?jiān)趨⒖假Y源中下載 exampleCode.zip。

    局限性

    正如我在前面提到的那樣,必須從同一個(gè) codebase 中加載這些 applet。此外,如果瀏覽器的兩個(gè)不同副本正在運(yùn)行,并且 applet 被加載到每個(gè)副本中,則 applet 可能無(wú)法彼此通信(取決于瀏覽器的版本和設(shè)置),因?yàn)樗鼈兛赡懿辉俟蚕硗粋€(gè)運(yùn)行時(shí)環(huán)境。但是,如果是瀏覽器本身衍生出新的瀏覽器窗口,則沒(méi)有任何問(wèn)題。

    該技巧已在幾個(gè)平臺(tái)和幾個(gè)瀏覽器版本中通過(guò)測(cè)試,但在某些配置中每個(gè) applet 的運(yùn)行時(shí)環(huán)境可能是獨(dú)立的。該技巧已在下面的操作系統(tǒng)和瀏覽器組合中通過(guò)測(cè)試:
  • Windows2000: Internet Explorer 5.0,Internet Explorer 5.5,Netscape Navigator 4.72,Opera 4.01
  • Windows 98: Internet Explorer 4.72,Internet Explorer 5.0,Netscape Navigator 4.02
  • Mac OS 9: Internet Explorer 4.5,
  • Netscape Navigator 4.5
    Red Hat 6.2: Netscape Navigator 4.73

    小結(jié)

    這篇技巧說(shuō)明了能使 applet 彼此通信的一種替代方法。這種方法以 Java API 的 getApplet() 方法不支持的方式工作。這篇技巧中介紹的知識(shí)增大了將 applet 作為網(wǎng)站或內(nèi)部網(wǎng)的一部分的可能性 -- 可以用它替代或補(bǔ)充 getApplets 方法。

    作者簡(jiǎn)介

    Tobias Hill 是 Citerus 的創(chuàng)辦者之一,該公司以瑞典為基地,致力于在 Java 平臺(tái)上構(gòu)建因特網(wǎng)、內(nèi)部網(wǎng)和外部網(wǎng)系統(tǒng)。Hill 從 1996 年開始用 Java 編程,參與了許多項(xiàng)目,從為自主控制的機(jī)器人編程到開發(fā)在線焰火明信片制作程序等等。

    參考資源

    * 說(shuō)明如何使用 AppletList 類的示例:
    exampleCode.zip
    * Sun 提供的關(guān)于 applet 間通信的 Java 教程:
    http://web2.java.sun.com/docs/books...tsonly/iac.html
    * Sun 提供的有關(guān) codebase(在其他問(wèn)題中)的 Java 教程:
    http://web2.java.sun.com/docs/books...sonly/html.html
    * 查看以前的所有 Java 技巧以及提交您自己的技巧:
    http://www.javaworld.com/javatips/j...tips.index.html
  • posted @ 2005-12-23 17:06 Ben 閱讀(371) | 評(píng)論 (0)編輯 收藏

    [轉(zhuǎn)貼]2005年11月程序語(yǔ)言世界排行榜-Java居首位

    摘要:
    近日來(lái),在TIOBE程序員社區(qū)中公布了其2005年11月的程序語(yǔ)言排行榜。這得注意的是PHP即將超過(guò)C++成為了排行榜的老三!而Java作為開源先鋒首當(dāng)其沖的成為了龍頭老大,并且仍然保持著很好的增長(zhǎng)勢(shì)頭。



    轉(zhuǎn)載:轉(zhuǎn)載請(qǐng)保留本信息,本文來(lái)自http://www.matrix.org.cn/resource/news/315.html


    版權(quán)申明:轉(zhuǎn)載必須保留以下信息
    作者:cleverpig

    可以自由轉(zhuǎn)載, 轉(zhuǎn)載請(qǐng)保留下面的作者信息:

    作者 cleverpig(http://www.matrix.org.cn/blog/cleverpig)


    近日來(lái),在TIOBE程序員社區(qū)中公布了其2005年11月的程序語(yǔ)言排行榜。這得注意的是PHP即將超過(guò)C++成為了排行榜的老三!而Java作為開源先鋒首當(dāng)其沖的成為了龍頭老大,并且仍然保持著很好的增長(zhǎng)勢(shì)頭。

    這個(gè)排行榜每月更新一次,其排名順序按照世界范圍內(nèi)的技術(shù)工程師、講師、第三方廠商的調(diào)查依據(jù),并查詢了目前流行的搜索引擎:Google,MSN,Yahoo,結(jié)合前兩者的數(shù)據(jù)計(jì)算后得出的。根據(jù)TIOBE的觀點(diǎn),此排行榜是被程序員們用來(lái)檢查自己的程序技能是否過(guò)時(shí),或者作為建立新的軟件系統(tǒng)時(shí)進(jìn)行參考之依據(jù),并非意味著哪種語(yǔ)言是最好的。

    1。世界前20位語(yǔ)言排行榜:




    2。世界前10位語(yǔ)言在前五年內(nèi)長(zhǎng)期發(fā)展趨勢(shì)圖:




    3。世界前30-50位語(yǔ)言排行榜:







    圖示說(shuō)明:
    * (Position):此列表明當(dāng)前語(yǔ)言與去年位置的變化。
    * Ratings:在查詢搜索引擎計(jì)算排名順序時(shí)使用了 '+" programming" -tv -channel'公式,對(duì)上12個(gè)月內(nèi)Google,MSN,Yahoo!和Google新聞組的數(shù)據(jù)進(jìn)行查詢。注意此公式應(yīng)用于標(biāo)準(zhǔn)的Google web點(diǎn)擊率、標(biāo)準(zhǔn)的MSN web點(diǎn)擊率、標(biāo)準(zhǔn)的Yahoo!web點(diǎn)擊率和標(biāo)準(zhǔn)的Google新聞組點(diǎn)擊率。這里的“標(biāo)準(zhǔn)”意味著一次對(duì)前50位語(yǔ)言web點(diǎn)擊率總和的查詢是均勻分布的,即保證了排名的相對(duì)公正性和科學(xué)性。
    * (Ratings): 此列表明當(dāng)前語(yǔ)言在上12個(gè)月內(nèi)的排名變化。
    * Status:帶有“A”的程序語(yǔ)言被認(rèn)為是主流語(yǔ)言。
    帶有“A-”和“A--”表示程序語(yǔ)言位于“A”和“B”之間。
    從支持能力的觀點(diǎn)看,盡量在工業(yè)的、任務(wù)危機(jī)的軟件系統(tǒng)中使用帶有“A”的主流程 序語(yǔ)言。
    如果某種語(yǔ)言在上3個(gè)月內(nèi)具有超過(guò)0.7%的增長(zhǎng)率,則此語(yǔ)言將獲得“A”狀態(tài)。上兩個(gè)月內(nèi)具有超過(guò)0.7%的增長(zhǎng)率的程序語(yǔ)言相應(yīng)的將獲得“A--”和“A-”狀態(tài)。

    posted @ 2005-12-23 16:53 Ben 閱讀(343) | 評(píng)論 (0)編輯 收藏

    你是否需要XML?

    XML是現(xiàn)在很熱門的一個(gè)話題,但是實(shí)際上它能為你的公司做些什么?你需不需要配置XML呢?大家只有對(duì)XML有所了解之后才能做出正確的評(píng)估,然后才能真正決定是否采用XML。通過(guò)權(quán)衡利弊,能夠幫助你做最后的決定。


    XML如何被使用?

    XML對(duì)于描述那些要被應(yīng)用程序所使用的數(shù)據(jù)來(lái)說(shuō)是一種非常出色的工具。這是由于絕大多數(shù)基于網(wǎng)絡(luò)的應(yīng)用軟件是使用這些數(shù)據(jù)制作出來(lái)的,而對(duì)于XML來(lái)說(shuō),它已經(jīng)發(fā)展成為了網(wǎng)絡(luò)服務(wù)的一種標(biāo)準(zhǔn)。



    你可以在企業(yè)里的許多層次上都使用XML。XML經(jīng)常被用來(lái)存儲(chǔ)那些會(huì)出現(xiàn)在網(wǎng)絡(luò)站點(diǎn)的內(nèi)容。你還可以把XML用作內(nèi)部的信息存儲(chǔ)庫(kù),這個(gè)庫(kù)是可以被第三方應(yīng)用軟件所訪問(wèn)的,而且不需要具備數(shù)據(jù)庫(kù)相關(guān)的功能。



    從內(nèi)部移動(dòng)到外部應(yīng)用軟件,XML可以讓你和合作者之間以一種有協(xié)議的方式進(jìn)行數(shù)據(jù)交換。你可以維持你系統(tǒng)原來(lái)的狀態(tài),而不用去考慮合作者系統(tǒng)的結(jié)構(gòu)。

    采用XML的有利條件

    許多企業(yè)采用XML的主要原因是由于它允許與外部的合作者進(jìn)行方便的集成。可能有三個(gè)提供商在為你服務(wù),他們都有自己的系統(tǒng),但是都需要訪問(wèn)相同的數(shù)據(jù)。XML允許你把數(shù)據(jù)制作成一種格式,讓這三者都能夠通過(guò)他們自己的系統(tǒng)來(lái)獲取和使用這些信息。



    很明顯,XML是由于它本身的簡(jiǎn)便易用以及節(jié)省時(shí)間的信息集中化管理而流行起來(lái)的。



    在適當(dāng)?shù)沫h(huán)境里,使用XML還有其它的一些好處。當(dāng)處理網(wǎng)絡(luò)應(yīng)用軟件的時(shí)候,把數(shù)據(jù)裝入XML文件然后再由應(yīng)用軟件進(jìn)行分析的方法能夠有效的簡(jiǎn)化保持維護(hù)的復(fù)雜性。這就不用再更換菜單、頁(yè)面標(biāo)題以及內(nèi)容了。在許多情況下,只需簡(jiǎn)單的編輯XML文件就能夠完成這些改變。



    XML還可以方便的用于擴(kuò)展存儲(chǔ)于文件中的內(nèi)容和內(nèi)容的類型。雖然這可能會(huì)比訪問(wèn)數(shù)據(jù)庫(kù)要花去更多的時(shí)間,但是如果只有相關(guān)的信息被存儲(chǔ)在文件中的話,那么,處理的時(shí)間則會(huì)被縮短。你可以使用編程語(yǔ)言中的查找與分類功能來(lái)實(shí)現(xiàn),而不是使用數(shù)據(jù)庫(kù)中的相關(guān)功能。但是,總的來(lái)說(shuō),XML的內(nèi)容是有意被顯示出來(lái)的,而且該過(guò)程也不是必需的。

    網(wǎng)絡(luò)服務(wù)對(duì)P2P的貢獻(xiàn)

    另一個(gè)很大的好處是你可以簡(jiǎn)單的就加入相關(guān)數(shù)據(jù)的子集,能夠禁止系統(tǒng)訪問(wèn)那些沒(méi)有被使用的信息。

    采用XML的缺點(diǎn)

    當(dāng)然,所有的事情都有兩面性,使用XML也有一些缺點(diǎn),這些缺點(diǎn)會(huì)讓你在真正使用它之前會(huì)再審慎的考慮一番。舉例來(lái)說(shuō),XML有可能會(huì)產(chǎn)生非常不便于維護(hù)的相當(dāng)巨大的數(shù)據(jù)量。由于這個(gè)原因,人們通常會(huì)把數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)中,然后才把輸出的相關(guān)信息送入XML。在這種情況下,你實(shí)際上并不把信息保存在XML文件中。這種情況是否被看作是一個(gè)不利條件還不確定,但是還是有必要在作決定之前考慮一下這種情況。



    XML有一個(gè)明顯的缺點(diǎn),就是缺少完整的安全保護(hù)。一個(gè)共享的XML文件對(duì)于請(qǐng)求的回應(yīng)是自動(dòng)的。如果你把該文件加密以尋求安全保護(hù),那么,接收端就不能夠自動(dòng)的識(shí)別出它的內(nèi)容。XML有幾種可以使用的安全標(biāo)準(zhǔn),但是還沒(méi)有最后確定選擇哪一個(gè)標(biāo)準(zhǔn)。



    因此,公司就需要限制他們的文件在VPN或者外部網(wǎng)絡(luò)上的發(fā)布。否則這些公司就會(huì)冒一定的風(fēng)險(xiǎn),因?yàn)槿魏稳硕贾涝趪?guó)際互聯(lián)網(wǎng)上如何瀏覽包含有重要信息的XML文件。



    控制訪問(wèn)也會(huì)帶來(lái)一系列的問(wèn)題。到安全標(biāo)準(zhǔn)被真正實(shí)現(xiàn)之前,唯一可信賴的方法就是為不同的人提供你信息的不同子集,這樣做能夠?yàn)椴煌娜藙?chuàng)建分開的XML文件。如果你試圖把XML作為企業(yè)B2B解決方案主要組成部分,并且還需要為每一方都進(jìn)行用戶化,那么,選擇使用數(shù)據(jù)庫(kù)可能比選擇使用包含大量XML文件的方式要好得多。

    如何做決定?

    在做決定之前,要考慮一下你要完成什么樣的目標(biāo),是否使用XML能讓完成這個(gè)目標(biāo)變得更加容易。你是否正試圖傳送相同的或者相關(guān)的信息給不同的人,這些人在他們的終端上都使用不同的軟件。如果是這樣的話,XML是你的好選擇。你是否希望能夠方便的維護(hù)你的網(wǎng)絡(luò)站點(diǎn)而不用依靠數(shù)據(jù)庫(kù)呢?那么,也可以選擇XML。



    然而,如果你處理的是比較敏感而且重要的數(shù)據(jù),又或者你正在把你數(shù)據(jù)的不同部分傳送給不同的目標(biāo),那么,你就會(huì)希望能夠得到更多的安全保護(hù)。如果你的解決方案中包含為相似的服務(wù)創(chuàng)建多個(gè)XML文件,你的選擇可能有些超前了,而且有可能會(huì)導(dǎo)致維護(hù)上的災(zāi)難。



    對(duì)于local應(yīng)用軟件,你可能會(huì)需要考慮一下具體配置的每一個(gè)細(xì)節(jié)。如果安全和訪問(wèn)都不是問(wèn)題的話,考慮一下,把你的信息都集中到一個(gè)XML源是否能夠讓你從中獲得好處。如果你需要顯示這些數(shù)據(jù),并且還會(huì)出現(xiàn)在不同的地方,那么,XML對(duì)于網(wǎng)絡(luò)服務(wù)來(lái)說(shuō)就是一個(gè)很好的選擇。

    總結(jié)

    如果你對(duì)于使用XML已經(jīng)有所準(zhǔn)備,那么你就要考慮一下數(shù)據(jù)的類型和工作的環(huán)境了,這些都能夠幫助你決定這是否是一個(gè)很好的解決方案。如果這么做有很明顯的好處,而且你并不介意安全上的問(wèn)題,那么,你只要多投入些注意力和智慧就可以了。否則,你可能就會(huì)希望別的人先于你這么做,而你等到時(shí)機(jī)成熟了才會(huì)選擇這樣的解決方案。

    posted @ 2005-12-23 16:49 Ben 閱讀(348) | 評(píng)論 (0)編輯 收藏

    快速精確的對(duì)數(shù)學(xué)表達(dá)式求值

    快速精確的對(duì)數(shù)學(xué)表達(dá)式求值 英文原文
    內(nèi)容:
    表達(dá)式求值的經(jīng)典算法
    W3Eval:一種新的方法
    結(jié)論
    參考資料
    關(guān)于作者
    對(duì)本文的評(píng)價(jià)
    相關(guān)內(nèi)容:
    教程:Building a Java applet
    更多 dW Java 參考資料
    使用這個(gè)方便的 applet ,您就能一步一步的計(jì)算數(shù)學(xué)表達(dá)式了 Nikola Stepan (nikola.stepan@vz.tel.hr)
    軟件工程師,ABIT Ltd.
    2001 年 9 月
    對(duì)于未經(jīng)訓(xùn)練的用戶來(lái)說(shuō),計(jì)算機(jī)科學(xué)領(lǐng)域中數(shù)學(xué)表達(dá)式求值的傳統(tǒng)方法即不順手又難以使用;軟件工程師 Nikola.Stepan 旨在改變這些傳統(tǒng)方法。他的 applet W3Eval 對(duì)表達(dá)式求值與您用紙筆計(jì)算的一系列步驟完全一致,但更快并且沒(méi)有錯(cuò)誤。請(qǐng)往下讀,了解這一挑戰(zhàn) — 人類易讀的數(shù)學(xué)到 Java 代碼的轉(zhuǎn)換。
    還記得在您的第一臺(tái)科學(xué)計(jì)算器上用逆波蘭表示法奮斗的經(jīng)歷嗎?W3Eval applet 無(wú)法讓您可信賴的 HP-41 更易用,正如它的名稱所暗示 — 一個(gè)只能運(yùn)行于 Web 的表達(dá)式求值程序。但它的確提供了一種方法 — 人類更易于遵循的對(duì)表達(dá)式一步一步的求值。

    W3Eval 的方法與傳統(tǒng)計(jì)算器不同,卻和人類的計(jì)算方式一致。當(dāng)您用傳統(tǒng)的計(jì)算器計(jì)算時(shí),每輸入一個(gè)新數(shù),前一個(gè)數(shù)就看不到了。如果在輸入一個(gè)長(zhǎng)表達(dá)式中出了錯(cuò),就得全部重來(lái)。有了 W3Eval,您就能看到參與計(jì)算的所有東西,還能輕松的編輯表達(dá)式。它獨(dú)特的能力(一步一步的對(duì)表達(dá)式求值)非常容易實(shí)現(xiàn),因?yàn)橛脩裟芸吹角笾档拿恳徊剑ㄅR時(shí)結(jié)果。

    本文將讓您從頭至尾認(rèn)識(shí) W3Eval 功能性的要點(diǎn);您將看到一些用于表達(dá)式求值的代碼。不過(guò),我們還是先看看表達(dá)式求值的經(jīng)典算法,這樣您就會(huì)明白 W3Eval 方法的差異究竟有多少。

    表達(dá)式求值的經(jīng)典算法
    編寫代碼對(duì)算術(shù)表達(dá)式求值的經(jīng)典方法由 Donald Knuth 描述于 1962 年(請(qǐng)參閱參考資料)。Knuth 將此概括為三個(gè)步驟:
    • 對(duì)中綴表達(dá)式進(jìn)行語(yǔ)法分析
    • 中綴表達(dá)式到后綴表達(dá)式的轉(zhuǎn)換
    • 對(duì)后綴表達(dá)式求值
    注意到我們談到的這個(gè)經(jīng)典算法有些簡(jiǎn)化:算術(shù)表達(dá)式只包含操作數(shù)、二元操作符和一種括號(hào)。此外,對(duì)于每個(gè)操作數(shù)和操作符,只用單個(gè)字符表示,使語(yǔ)法分析直觀。

    表達(dá)式表示法
    算術(shù)表達(dá)式中最常見的表示法形式有中綴、前綴后綴表示法。中綴表示法是書寫表達(dá)式的常見方式,而前綴和后綴表示法主要用于計(jì)算機(jī)科學(xué)領(lǐng)域。

    中綴表示法
    中綴表示法是算術(shù)表達(dá)式的常規(guī)表示法。稱它為中綴表示法是因?yàn)槊總€(gè)操作符都位于其操作數(shù)的中間,這種表示法只適用于操作符恰好對(duì)應(yīng)兩個(gè)操作數(shù)的時(shí)候(在操作符是二元操作符如加、減、乘、除以及取模的情況下)。對(duì)以中綴表示法書寫的表達(dá)式進(jìn)行語(yǔ)法分析時(shí),需要用括號(hào)和優(yōu)先規(guī)則排除多義性。



    Syntax: operand1 operator operand2Example: (A+B)*C-D/(E+F)
    前綴表示法
    前綴表示法中,操作符寫在操作數(shù)的前面。這種表示法經(jīng)常用于計(jì)算機(jī)科學(xué),特別是編譯器設(shè)計(jì)方面。為紀(jì)念其發(fā)明家 — Jan Lukasiewicz(請(qǐng)參閱參考資料),這種表示法也稱波蘭表示法



    Syntax : operator operand1 operand2Example : -*+ABC/D+EF
    后綴表示法
    在后綴表示法中,操作符位于操作數(shù)后面。后綴表示法也稱逆波蘭表示法(reverse Polish notation,RPN),因其使表達(dá)式求值變得輕松,所以被普遍使用。



    Syntax : operand1 operand2 operatorExample : AB+C*DEF+/-
    前綴和后綴表示法有三項(xiàng)公共特征:
    • 操作數(shù)的順序與等價(jià)的中綴表達(dá)式中操作數(shù)的順序一致
    • 不需要括號(hào)
    • 操作符的優(yōu)先級(jí)不相關(guān)
    中綴表達(dá)式到后綴表達(dá)式的轉(zhuǎn)換
    要把表達(dá)式從中綴表達(dá)式的形式轉(zhuǎn)換成用后綴表示法表示的等價(jià)表達(dá)式,必須了解操作符的優(yōu)先級(jí)和結(jié)合性。優(yōu)先級(jí)或者說(shuō)操作符的強(qiáng)度決定求值順序;優(yōu)先級(jí)高的操作符比優(yōu)先級(jí)低的操作符先求值。 如果所有操作符優(yōu)先級(jí)一樣,那么求值順序就取決于它們的結(jié)合性。操作符的結(jié)合性定義了相同優(yōu)先級(jí)操作符組合的順序(從右至左或從左至右)。



    Left associativity : A+B+C = (A+B)+CRight associativity : A^B^C = A^(B^C)
    轉(zhuǎn)換過(guò)程包括用下面的算法讀入中綴表達(dá)式的操作數(shù)、操作符和括號(hào):
    1. 初始化一個(gè)空堆棧,將結(jié)果字符串變量置空。
    2. 從左到右讀入中綴表達(dá)式,每次一個(gè)字符。
    3. 如果字符是操作數(shù),將它添加到結(jié)果字符串。
    4. 如果字符是個(gè)操作符,彈出(pop)操作符,直至遇見開括號(hào)(opening parenthesis)、優(yōu)先級(jí)較低的操作符或者同一優(yōu)先級(jí)的右結(jié)合符號(hào)。把這個(gè)操作符壓入(push)堆棧。
    5. 如果字符是個(gè)開括號(hào),把它壓入堆棧。
    6. 如果字符是個(gè)閉括號(hào)(closing parenthesis),在遇見開括號(hào)前,彈出所有操作符,然后把它們添加到結(jié)果字符串。
    7. 如果到達(dá)輸入字符串的末尾,彈出所有操作符并添加到結(jié)果字符串。
    后綴表達(dá)式求值
    對(duì)后綴表達(dá)式求值比直接對(duì)中綴表達(dá)式求值簡(jiǎn)單。在后綴表達(dá)式中,不需要括號(hào),而且操作符的優(yōu)先級(jí)也不再起作用了。您可以用如下算法對(duì)后綴表達(dá)式求值:
    1. 初始化一個(gè)空堆棧
    2. 從左到右讀入后綴表達(dá)式
    3. 如果字符是一個(gè)操作數(shù),把它壓入堆棧。
    4. 如果字符是個(gè)操作符,彈出兩個(gè)操作數(shù),執(zhí)行恰當(dāng)操作,然后把結(jié)果壓入堆棧。如果您不能夠彈出兩個(gè)操作數(shù),后綴表達(dá)式的語(yǔ)法就不正確。
    5. 到后綴表達(dá)式末尾,從堆棧中彈出結(jié)果。若后綴表達(dá)式格式正確,那么堆棧應(yīng)該為空。
    W3Eval:一種新的方法
    W3Eval 的方法與上面概括的經(jīng)典算法不同。不是把中綴表達(dá)式轉(zhuǎn)換為后綴表示法;恰恰相反,它對(duì)中綴表達(dá)式直接求值。這種方法比傳統(tǒng)方法稍微復(fù)雜了些,但它支持一步一步的求值,在執(zhí)行時(shí)您能看到每一步。求值過(guò)程類似于手工計(jì)算:如果表達(dá)式中包含括號(hào),先求嵌套最深的括號(hào)對(duì)中的子表達(dá)式的值。所有括號(hào)內(nèi)的子表達(dá)式都求值完畢后,表達(dá)式的其它部分再求值。

    求值過(guò)程分為三個(gè)步驟:
    1. 表達(dá)式語(yǔ)法分析
    2. 表達(dá)式檢查
    3. 一步一步的求值
    表達(dá)式語(yǔ)法分析
    W3Eval 的數(shù)學(xué)表達(dá)式由數(shù)字、變量、操作符、函數(shù)和括號(hào)組成。除了缺省的十進(jìn)制計(jì)數(shù)制外 W3Eval 還支持二進(jìn)制、八進(jìn)制和十六進(jìn)制。這些以其它計(jì)數(shù)制計(jì)數(shù)的數(shù)必須以 # 開頭,并緊跟 bo 或者 h 來(lái)分別表示二進(jìn)制、八進(jìn)制或十六進(jìn)制。

    W3Eval 的變量是不限長(zhǎng)度的大寫字母和數(shù)字序列,其首字符必須是字母。W3Eval 有一些預(yù)定義的變量,不過(guò)它也支持用戶定義的變量。

    W3Eval 支持帶有固定或不定數(shù)量自變量的函數(shù)。 函數(shù)可分為以下幾組:
    • 三角函數(shù)(sin、cos、tan、cot、sec、csc)
    • 反三角函數(shù)(asin、acos、atan、atan2、acot、asec、acsc)
    • 雙曲線函數(shù)(sinh、cosh、tanh、coth、sech、csch)
    • 反雙曲線函數(shù)(asinh、acosh、atanh、acoth、asech、acsch)
    • 指數(shù)函數(shù)(log、log2、log10、exp、exp2、exp10、sqrt、cur)
    • 組合學(xué)函數(shù)(Combinatoric)(comb、combr、perm、permr、var、varr)
    • 統(tǒng)計(jì)函數(shù)(sum、avg、min、max、stddev、count)
    • 其它(abs、ceil、fact、floor、pow、random、rint、round、sign、frac、hypot、deg、rad、trunc、int)
    W3Eval 對(duì)表達(dá)式進(jìn)行語(yǔ)法分析,也就是指它識(shí)別出表達(dá)式的算術(shù)成分,并將它們轉(zhuǎn)化成語(yǔ)言符號(hào)(token),然后把它們放入向量。表達(dá)式一旦處于這種狀態(tài),就為下面兩步做好了準(zhǔn)備:表達(dá)式檢查和求值。

    W3Eval 的符號(hào)(token)是算術(shù)表達(dá)式的組成部分;記號(hào)(mark) 是獨(dú)立的字符, 由 applet 使用,作為識(shí)別各種符號(hào)的內(nèi)部標(biāo)志。每種符號(hào)有唯一的 mark 與之對(duì)應(yīng)。W3Eval 的表達(dá)式由表 1 所示的符號(hào)組成。

    表 1. W3Eval 的符號(hào)
    Token Mark
    十進(jìn)制數(shù) Double
    二進(jìn)制數(shù) String
    十六進(jìn)制數(shù) String
    八進(jìn)制數(shù) String
    變量 Variable
    函數(shù) Function
    操作符 Operator
    開括號(hào) String
    閉括號(hào) String
    逗號(hào) String


    用以表示函數(shù)、操作符和變量類的定義如清單 1 所示:

    清單 1. Function、Operator 和 Variable 類的定義


    public class Function { public String function; public int number_of_arguments; public Function( String function, int number_of_arguments ) { this.function=function; this.number_of_arguments=number_of_arguments; } public String toString() { return function; } }public class Operator { public String operator; public byte priority; public Operator( String operator, byte priority ) { this.operator=operator; this.priority=priority; } public String toString() { return operator; } }public class Variable { public String variable; public double value; public Variable( String variable, double value ) { this.variable=variable; this.value=value; } public String toString() { return variable; } }
    Token 類如清單 2 所示。

    清單 2. Token 類


    public class Token { public Object token; public char mark; public int position; public int length; public Token ( Object token, char mark, int position, int length ) { this.token=token; this.mark=mark; this.position=position; this.length=length; } public String toString() { return token.toString()+" ; "+mark+" ; "+position+" ; "+length+""; } }
    表達(dá)式檢查
    檢查正規(guī)表達(dá)式正確性的所有代碼都在一個(gè)獨(dú)立的類中。詳細(xì)的表達(dá)式檢查能夠確定錯(cuò)誤確切的類型和位置。 錯(cuò)誤檢查有七類:

    括號(hào)檢查。W3Eval 的表達(dá)式可以包含三種括號(hào):標(biāo)準(zhǔn)圓括號(hào)、方括號(hào)和花括號(hào)。如果表達(dá)式包含相同數(shù)量的開括號(hào)和閉括號(hào),并且每個(gè)開括號(hào)與一個(gè)相應(yīng)的同種閉括號(hào)相匹配,則表達(dá)式的括號(hào)語(yǔ)法正確。三種括號(hào)在語(yǔ)義上等價(jià),如下面的代碼段所示。

    清單 3. 三種括號(hào)


    import java.util.Stack;public class Parentheses_check { public static boolean is_open_parenthesis( char c ) { if ( c=='(' || c=='[' || c=='{' ) return true; else return false; } public static boolean is_closed_parenthesis( char c ) { if ( c==')' || c==']' || c=='}' ) return true; else return false; } private static boolean parentheses_match( char open, char closed ) { if ( open=='(' && closed==')' ) return true; else if ( open=='[' && closed==']' ) return true; else if ( open=='{' && closed=='}' ) return true; else return false; } public static boolean parentheses_valid( String exp ) { Stack s = new Stack(); int i; char current_char; Character c; char c1; boolean ret=true; for ( i=0; i < exp.length(); i++ ) { current_char=exp.charAt( i ); if ( is_open_parenthesis( current_char ) ) { c=new Character( current_char ); s.push( c ); } else if ( is_closed_parenthesis( current_char ) ) { if ( s.isEmpty() ) { ret=false; break; } else { c=(Character)s.pop(); c1=c.charValue(); if ( !parentheses_match( c1, current_char ) ) { ret=false; break; } } } } if ( !s.isEmpty() ) ret=false; return ret; } }
    token 檢查。檢查表達(dá)式語(yǔ)法。確保表達(dá)式所有部分都被認(rèn)為是合法的。

    表達(dá)式開頭的檢查(請(qǐng)參閱清單 4確保表達(dá)式從合法的符號(hào)開始。不可以用操作符、逗號(hào)或閉括號(hào)作為表達(dá)式的開始符。





    清單 4. 正確的表達(dá)式開頭的檢查


    private static boolean begin_check( Vector tokens, Range r, StringBuffer err ) { char mark; Token t; t=(Token)tokens.elementAt( 0 ); mark=t.mark; if ( mark=='P' ) err.append( Messages.begin_operator ); else if ( mark==')' ) err.append( Messages.begin_parenthesis ); else if ( mark=='Z' ) err.append ( Messages.begin_comma ); else return true; r.start=0; r.end=t.length; return false; }


    表達(dá)式末尾的檢查。確保表達(dá)式以合法符號(hào)結(jié)束。不可以用操作符、函數(shù)、逗號(hào)或開括號(hào)作為表達(dá)式結(jié)束符。

    符號(hào)序列的檢查。檢查表達(dá)式中的符號(hào)序列。在下面的表格中,若 X 軸上的符號(hào)和 Y 軸上的符號(hào)對(duì)應(yīng)的交界處用 X 作了記號(hào),則相應(yīng) X 軸上的符號(hào)可以接在 Y 軸上符號(hào)的后面。

    表 2. 合法的符號(hào)序列
    _ D B H O V F P ( ) Z
    D _ _ _ _ _ _ _
    B _ _ _ _ _ _ _
    H _ _ _ _ _ _ _
    O _ _ _ _ _ _ _
    V _ _ _ _ _ _ _
    F _ _ _ _ _ _ _ _ _
    P _ _ _
    ( _ _ _
    ) _ _ _ _ _ _ _
    Z _ _ _


    函數(shù)檢查。確保表達(dá)式中所有函數(shù)的自變量數(shù)量正確。

    逗號(hào)檢查。逗號(hào)只能用于分隔函數(shù)的自變量。若用于表達(dá)式其它地方,就不合法。

    一步一步的求值
    只有能順利通過(guò)以上概括的所有檢查的表達(dá)式,W3Eval 才求值。從而確保內(nèi)建于 W3Eval 中的前提條件不會(huì)出現(xiàn)問(wèn)題。后面的算法用于單步執(zhí)行表達(dá)式求值:
    1. 找出嵌入最深的那對(duì)括號(hào)。
    2. 在這對(duì)括號(hào)中,找出優(yōu)先級(jí)最高的操作符。
    3. 若這對(duì)括號(hào)中沒(méi)有操作符:
      • 如果表達(dá)式再不包含任何其它的括號(hào),求值(過(guò)程)完成。
      • 如果表達(dá)式包含括號(hào),但不包含操作符,則存在一個(gè)函數(shù)。對(duì)函數(shù)求值,然后轉(zhuǎn)到步驟 5。
    4. 獲取操作數(shù)并執(zhí)行運(yùn)算。
    5. 從向量中除去用過(guò)的符號(hào)并在同一位置放入結(jié)果。
    6. 除去冗余括號(hào)。
    7. 將向量中剩余的符號(hào)結(jié)合到字符串并在屏幕上顯示結(jié)果。
    現(xiàn)在,我們將更為詳細(xì)的查看算法的每一步,同時(shí)查看大部分有意思的代碼片段。

    步驟 1:為避免括號(hào)的處理,W3Eval 確定哪個(gè)子表達(dá)式處于嵌套最深的那對(duì)括號(hào)中。這項(xiàng)任務(wù)需要兩步。第一步,W3Eval 必須找出第一個(gè)閉括號(hào):

    清單 5. 找出第一個(gè)閉括號(hào)


    public static int pos_first_closed_parenthesis( Vector tokens ) { Token t; for ( int i=0; i
    第二步,找出與第一步找到的閉括號(hào)相匹配的開括號(hào),如清單 6 所示





    清單 6. 找出匹配的開括號(hào)


    public static int pos_open_parenthesis( Vector tokens, int closed_parenthesis ) { int i; Token t; i=closed_parenthesis-2; while ( i>=0 ) { t=(Token)tokens.elementAt( i ); if ( t.mark=='(' ) { return i; } i--; } return 0; }


    步驟 2:要實(shí)現(xiàn)求值的單步執(zhí)行,W3Eval 在嵌套最深的那對(duì)括號(hào)中找出優(yōu)先級(jí)最高的操作符。(操作符的優(yōu)先級(jí)已硬編碼到 applet 中;請(qǐng)參閱參考資料以獲取完整的代碼清單。)

    清單 7. 找出優(yōu)先級(jí)最高的操作符


    public static int pos_operator( Vector tokens, Range r ) { byte max_priority=Byte.MAX_VALUE; int max_pos=0; byte priority; String operator; Token t; for ( int i=r.start+2; i<=r.end-2; i++ ) { t=(Token)tokens.elementAt( i ); if ( t.mark!='P' ) continue; priority=((Operator)t.token).priority; operator=((Operator)t.token).operator; if ( priority < max_priority || ( operator.equals("^") || operator.equals("**") ) && priority == max_priority ) { max_priority=priority; max_pos=i; } } return max_pos; }
    步驟 3:如果表達(dá)式中不包含其它括號(hào),求值的過(guò)程就完成。如果表達(dá)式包含括號(hào),但不包含操作符,則存在需要求值的函數(shù)。

    清單 8. 檢查是否還有其它操作符


    ...int poz_max_op=pos_operator( tokens, range );// if there are no operatorsif ( poz_max_op==0 ) { if ( no_more_parentheses ) { return false; } else { double result; result=function_result( tokens, range.start-1 ); function_tokens_removal( tokens, range.start-1 ); t = new Token ( new Double(result), 'D', 0, 0 ); tokens.setElementAt( t, range.start-1 ); parentheses_removal( tokens, range.start-1 ); return true; } }...
    步驟 4:所有的操作符都是二元的,也就是說(shuō)第一個(gè)操作數(shù)位于操作符之前,第二個(gè)操作符位于操作符之后。

    清單 9. 獲取操作數(shù)并執(zhí)行運(yùn)算


    ...double operand1, operand2;// first operand is before...t=(Token)tokens.elementAt( poz_max_op-1 );operand1=operand_value( t );// ...and second operand is after operatort=(Token)tokens.elementAt( poz_max_op+1 );operand2=operand_value( t );// operatort=(Token)tokens.elementAt( poz_max_op );String op=((Operator)t.token).operator;double result=operation_result( operand1, operand2, op );tokens.removeElementAt( poz_max_op+1 );tokens.removeElementAt( poz_max_op );t = new Token ( new Double(result), 'D', 0, 0 );tokens.setElementAt( t, poz_max_op-1 );parentheses_removal( tokens, poz_max_op-1 );...
    操作數(shù)可以是變量,還可以是十進(jìn)制、十六進(jìn)制、八進(jìn)制或二進(jìn)制數(shù)。

    清單 10. 獲取操作數(shù)


    public static double operand_value( Token t ) { if ( t.mark=='V' ) return ((Variable)t.token).value; else if ( t.mark=='D' ) return ((Double)t.token).doubleValue(); else if ( t.mark=='H' ) return base_convert( ((String)t.token).substring(2), 16 ); else if ( t.mark=='O' ) return base_convert( ((String)t.token).substring(2), 8 ); else if ( t.mark=='B' ) return base_convert( ((String)t.token).substring(2), 2 ); }
    接下來(lái)的方法將不同計(jì)數(shù)制的數(shù)轉(zhuǎn)化為十進(jìn)制的形式。

    清單 11. 將數(shù)轉(zhuǎn)化為十進(jìn)制數(shù)


    public static long base_convert( String s, int base ) { long r=0; int i, j; for ( i=s.length()-1, j=0; i>=0; i--, j++ ) r=r+digit_weight( s.charAt( i ) )*(long)Math.pow( base, j ); return r; }public static int digit_weight( char c ) { if ( Character.isDigit( c ) ) return c-48; else if ( 'A'<=c && c<='f' ) return c-55; else if ( 'a'<=c && c<='f' ) return c-87; return -1; }
    一旦確定操作數(shù)和操作符后,就可以執(zhí)行運(yùn)算了,如清單 12 所示。

    步驟 5:在這步中,W3Eval 從向量中除去用過(guò)的符號(hào)并在同一位置放入結(jié)果。對(duì)于函數(shù)求值這類情況,除去的是函數(shù)、括號(hào)、自變量和逗號(hào);而對(duì)于操作符求值這類情況而言,除去的則是操作數(shù)和操作符。

    步驟 6:在求值的這一步,W3Eval 從表達(dá)式中除去冗余括號(hào)。

    清單 13. 除去冗余括號(hào)


    private static void parentheses_removal( Vector tokens, int pos ) { if ( pos>1 &&&& ((Token)tokens.elementAt( poz-2 )).mark!='F' &&&& ((Token)tokens.elementAt( poz-1 )).mark=='(' &&&& ((Token)tokens.elementAt( poz+1 )).mark==')' || pos==1 &&&& ((Token)tokens.elementAt( 0 )).mark=='(' &&&& ((Token)tokens.elementAt( 2 )).mark==')' ) { tokens.removeElementAt( poz+1 ); tokens.removeElementAt( poz-1 ); } return; }
    步驟 7:在求值的最后一步,向量中剩余的符號(hào)被結(jié)合到字符串,并在屏幕上顯示。

    清單 14. 結(jié)合符號(hào)并顯示結(jié)果


    public static String token_join( Vector tokens ) { String result=new String(); Token t; for ( int i=0; i < tokens.size(); i++ ) { t=(Token)tokens.elementAt( i ); if ( t.mark=='D' ) { double n=((Double)t.token).doubleValue(); result=result + formated_number( n ); } else result=result + t.token; if ( result.endsWith( ".0" ) ) result=result.substring( 0, result.length()-2 ); result=result + " "; } return result; }
    結(jié)論
    本文分析了一個(gè) applet ,它能一步一步的對(duì)算術(shù)表達(dá)式求值。同時(shí)還按順序回顧了最有意思的代碼片段,并論述了兩種不同的表達(dá)式求值方法。

    下一版 W3Eval 有望在各方面得到增強(qiáng),包括有能力添加用戶定義的功能;支持分?jǐn)?shù)、復(fù)數(shù)和矩陣;改良的圖形用戶界面(GUI);大小和速度優(yōu)化以及安全性方面的增強(qiáng)。我鼓勵(lì)您提供您自己對(duì)于增強(qiáng)方面的設(shè)想。

    我希望您會(huì)發(fā)現(xiàn) W3Eval 是個(gè)對(duì)表達(dá)式求值有益的在線工具,它在某種程度上比經(jīng)典的方法更簡(jiǎn)單自然。我還期待這里談到的代碼和算法使您明白 Java 語(yǔ)言有助于處理數(shù)學(xué)問(wèn)題。

    參考資料
    • W3Eval applet 是免費(fèi)的,它的幫助有助于您解決問(wèn)題。
    • 這張表格展示了 W3Eval 操作符的優(yōu)先級(jí)
    • 請(qǐng)閱讀波蘭數(shù)學(xué)家 Jan Lukasiewicz 的傳記。
    • Donald Knuth,計(jì)算機(jī)科學(xué)領(lǐng)域卓越的學(xué)者,曾詳盡的就算法的設(shè)計(jì)和分析撰寫和演講。他的主頁(yè)提供最近出版的有關(guān)其作品的論文和信息的鏈接。
    • 有興趣隨意編寫 applet 嗎?可以查看我們的教程 Building a Java applet(developerWorks,1999 年)以獲得一步一步的指導(dǎo)。
    • 您會(huì)覺得 Java FAQ 很有用。
    • 還有很多有關(guān) applet 的信息在 Peter Van Der Linden(Prentice Hall PTR/Sun Microsystems 出版社出版,1998 年 12 月)的Just Java 2 中。
    • 由 Ken Arnold、James Gosling 和 David Holmes 撰寫的 The Java Programming Language(Addison Wesley 出版社出版,2000 年 12 月)包含有益的關(guān)于集合的信息。
    • 學(xué)習(xí) Martin Bastiaan 的“A Walk in the Park”(developerWorks,1998 年 1 月),了解更多有關(guān) applet 的知識(shí)。
    • VisualAge for Java 使 applet 的開發(fā)變得輕而易舉。
    • developerWorks Java 技術(shù)專區(qū)查找更多 Java 參考資料。

    關(guān)于作者
    Nikola Stepan 是 ABIT Ltd. 的軟件工程師,他在那里從事銀行業(yè)軟件的設(shè)計(jì)和開發(fā)。他有廣博的信息系統(tǒng)方面的學(xué)術(shù)背景和豐富的編程經(jīng)驗(yàn)(從低級(jí)編程到信息系統(tǒng))。他特別喜歡面向?qū)ο缶幊陶Z(yǔ)言、關(guān)系數(shù)據(jù)庫(kù)、因特網(wǎng)編程和系統(tǒng)編程。他于 1999 年在克羅地亞 Varazdin 的 Faculty of Organisation and Informatic 獲得信息系統(tǒng)學(xué)士學(xué)位。他會(huì)說(shuō)克羅地亞語(yǔ)、英語(yǔ)和一點(diǎn)德語(yǔ)。請(qǐng)通過(guò) nikola.stepan@vz.tel.hr 與 Nikola 聯(lián)系。
    __________________
    “日本固有新奇的武器,我當(dāng)以熱血應(yīng)付;日本固有猛烈的槍炮,我當(dāng)以頭顱拼擋。”
    “作為軍人,志在以身報(bào)國(guó),茍有一線之機(jī)不減,自應(yīng)鼓舞勇氣,而為國(guó)家盡其最后之犧牲。凡為官為吏,不過(guò)一時(shí)職業(yè)之選擇,民族之保存,始為骨頭之歸宿!”

    posted @ 2005-12-23 16:28 Ben 閱讀(1343) | 評(píng)論 (0)編輯 收藏

    僅列出標(biāo)題
    共3頁(yè): 上一頁(yè) 1 2 3 下一頁(yè) 
    主站蜘蛛池模板: 精品亚洲国产成人av| 久久一区二区三区免费播放| 免费成人福利视频| 中国亚洲女人69内射少妇| 国产亚洲精品VA片在线播放| 十九岁在线观看免费完整版电影| 免费一级毛片女人图片| 亚洲av成人一区二区三区| av永久免费网站在线观看| 亚洲国产黄在线观看| 亚洲最大天堂无码精品区| 久久久久国产精品免费免费不卡| 亚洲五月午夜免费在线视频| 亚洲一久久久久久久久| 久久九九兔免费精品6| 亚洲AV无码精品无码麻豆| 一级毛片aaaaaa视频免费看| 四虎成人免费影院网址| 亚洲宅男天堂a在线| 免费国产在线视频| 在线精品亚洲一区二区小说| 国产亚洲精品美女2020久久| 成人免费视频88| 亚洲成a人片毛片在线| 国产好大好硬好爽免费不卡| 国产偷国产偷亚洲高清日韩| 国产亚洲视频在线观看网址| 久久WWW色情成人免费观看| 亚洲永久中文字幕在线| 先锋影音资源片午夜在线观看视频免费播放| 亚洲日韩涩涩成人午夜私人影院| 亚洲AV成人一区二区三区观看| 日韩精品成人无码专区免费| 亚洲理论片在线中文字幕| 免费人成在线观看网站| 亚洲美女又黄又爽在线观看| 国产V片在线播放免费无码| 亚洲成av人片一区二区三区| 国产99久久亚洲综合精品| 日本大片在线看黄a∨免费| 亚洲免费综合色在线视频|