Luben Park

          Java Ben 成長之路

          #

          RSS知識簡介:什么是RSS以及RSS的歷史及發展歷程

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

              一、什么是RSS?

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

              說得更加簡單一點,RSS就是一種用來分發和匯集網頁內容的XML格式!如果你還是不太明白,沒有關系,RSS是什么其實基本就不重要,重要的是RSS可以做什么,下面我們就來了解一下,RSS能給我們帶來什么?

              小知識

              BLOG:BLOG是Web Log的簡稱。在國內,人們通常稱它為博客。它是一種作者與讀者以日記風格進行交互的中介。在軟件社區,人們以博客形式來共享觀念與思想變得越來越流行,人們開始以博客的形式互相學習,博客已經成了一個技術交流的場所!如:http://blogs.msdn.com 就是MSDN上的一個blogging。而在國內博客中國也已經越來越有名。http://www.blogchina.com。

              XML:XML是Extensible Markup Language的簡寫,一種擴展性標識語言。

              二、RSS的歷史

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

              最初的0.90版本RSS是由Netscape公司設計的,目的是用來建立一個整合了各主要新聞站點內容的門戶,但是0.90版本的RSS規范過于復雜,而一個簡化的RSS 0.91版本也隨著Netscape公司對該項目的放棄而于2000年暫停。

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

              在UserLand公司接手并不斷開發RSS的同時,很多的專業人士認識到需要通過一個第三方、非商業的組織,把RSS發展成為一個通用的規范,并進一步標準化。于是2001年一個聯合小組在0.90版本RSS的開發原則下,以W3C新一代的語義網技術RDF(Resource Description Framework)為基礎,對RSS進行了重新定義,發布RSS1.0,并將RSS定義為“RDF Site Summary”。但是這項工作沒有與UserLand公司進行有效的溝通,UserLand公司也不承認RSS 1.0的有效性,并堅持按照自己的設想進一步開發出RSS的后續版本,到2002年9月發布了最新版本RSS 2.0,UserLand公司將RSS定義為“Really Simple Syndication”。

              目前RSS已經分化為RSS 0.9x/2.0和RSS 1.0兩個陣營,由于分歧的存在和RSS 0.9x/2.0的廣泛應用現狀,RSS 1.0還沒有成為標準化組織的真正標準。

              三、RSS可以干什么?

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

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

              你再也不用一個網站一個網站,一個網頁一個網頁去逛了。只要這將你需要的內容訂閱在一個RSS閱讀器中,這些內容就會自動出現你的閱讀器里,你也不必為了一個急切想知道的消息而不斷的刷新網頁,因為一旦有了更新,RSS閱讀器就會自己通知你!

              三、RSS閱讀器

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

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

              第二類新聞閱讀器通常是內嵌于已在計算機中運行的應用程序中。例如,NewsGator內嵌在微軟的Outlook中,所訂閱的新聞標題位于Outlook的收件箱文件夾中。另外,Pluck內嵌在Internet Explorer瀏覽器中!

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

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

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

              五、RSS的未來發展

              隨著越來越多的站點對RSS的支持,RSS已經成為目前最成功的XML應用。RSS搭建了信息迅速傳播的一個技術平臺,使得每個人都成為潛在的信息提供者。相信很快我們就會看到大量基于RSS的專業門戶、聚合站點和更精確的搜索引擎。

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

          有關webservice的一些介紹和調用方法

               摘要: [轉]http://www.54bk.com/user1/8454/archives/2005/26611.html1. 什么是webservice   從表面上看,Web service 就是一個應用程序,它向外界暴露出一個能夠通過Web進行調用的API。這就是說,你能夠用編程的方法通過Web來調用這個應用程序。   對Web service 更精確的解釋: Web services是建立可...  閱讀全文

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

          [轉]使用XML的五種場合

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

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

          [轉貼]使用jsp實現word、excel格式報表打印

          使用jsp實現word、excel格式報表打印
          轉載 (evan 原創)
           

          title: 使用JSP實現WORD、EXCEL格式報表打印

          author: evan

          email: maioto:evan_zhao@hotmail.com

          date: 2003-08-21


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

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

          此方法優勢是模板設計、調整方便,無需在服務器端使用復雜的POI或jxl技術,也無需在客戶端使用ActiveX控件技術,更安全、方便,輕松實現較好的打印效果。 

          microsoft關于服務器端動態創建office文檔的資料(asp示例): 
          http://support.microsoft.com/default.aspx?scid=KB;en-us;301044&
           
          簡單示例:

          使用word建立一文檔,畫表格如下:
          ----------------------------
          | 用戶名 | 真實姓名 | 性別 |
          ----------------------------
          | guest  | 路人甲   | 男   |
          ----------------------------
          保存為Web頁test.htm, 將test.htm改名為test.jsp,修改其中guest、路人甲、男為從數據庫動態查詢,如下:

          <%@ 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"'>真實姓名</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數據庫
          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 閱讀(464) | 評論 (0)編輯 收藏

          [轉帖]XML輕松學習手冊


          轉載自:http://www.knowsky.com/2991.html

          XML輕松學習手冊(1)XML快速入門

          文章類別:XML教程   發表日期:2003-6-3  星期二  
          --------------------------------------------------------------------------------
          轉自:動態網制作指南 www.knowsky.com
          前言

          XML越來越熱,關于XML的基礎教程網絡上也隨處可見。可是一大堆的概念和術語往往讓人望而生畏,很多朋友問我:XML到底有什么用,我們是否需要學習它?我想就我個人學習過程的心得和經驗,寫一篇比較全面的介紹文章。首先有兩點是需要肯定的: 

          第一:XML肯定是未來的發展趨勢,不論是網頁設計師還是網絡程序員,都應該及時學習和了解,等待只會讓你失去機會; 

          第二:新知識肯定會有很多新概念,嘗試理解和接受,您才可能提高。不要害怕和逃避,畢竟我們還年輕。 

          提綱

          本文共分五大部分。分別是XML快速入門,XML的概念,XML的術語,XML的實現,XML的實例分析。最后附錄介紹了XML的相關資源。作者站在普通網頁設計人員的角度,用平實生動的語言,向您講述XML的方方面面,幫助你撥開XML的神秘面紗,快速步入XML的新領域。 

          第一章:XML快速入門

          一. 什么是XML? 

          二. XML是新概念嗎? 

          三. 使用XML有什么好處? 

          四. XML很難學嗎? 

          五. XML和HTML的區別 

          六. XML的嚴格格式 

          七. 關于XML的更多 

          一. 什么是XML?

           

          這往往是第一個問題,也往往在第一個問題上你就會搞不明白,因為大多的教材上這樣回答:

          XML是Extensible Markup Language的簡寫,一種擴展性標識語言。 這是標準的定義。那么什么是標志語言,為什么叫擴展性?已經讓人有些糊涂。我想我們這樣來理解會好一些:

          對HTML你已經非常熟悉了吧,它就是一種標記語言,記得它的全稱嗎:"Hypertext Markup Language" 超文本標記語言。明白了?同時,HTML里面有很多標簽,類似,等,都是在HTML 
          4.0里規范和定義,而XML里允許你自己創建這樣的標簽,所以叫做可擴展性。

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

          1.XML并不是標記語言。它只是用來創造標記語言(比如HTML)的元語言。天,又糊涂了!不要緊,你只要知道這一點:XML和HTML是不一樣的,它的用處途比HTML廣泛得多,我們將在后面仔細介紹。

          2.XML并不是HTML的替代產品。XML不是HTML的升級,它只是HTML的補充,為HTML擴展更多功能。我們仍將在較長的一段時間里繼續使用HTML。(但值得注意的是HTML的升級版本XHTML的確正在向適應XML靠攏。)

          3.不能用XML來直接寫網頁。即便是包含了XML數據,依然要轉換成HTML格式才能在瀏覽器上顯示。

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

          <myfile>

          <title>XML Quick Start</title>

          <author>ajie</author>

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

          <date>20010115</date>

          </myfile> 

           

          注意:

           

          1.這段代碼僅僅是代碼,讓你初步感性認識一下XML,并不能實現什么具體應用;

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

          二. XML是新概念嗎? 

          不是。XML來源于SGML,一種比HTML更早的標志語言標準。 

          關于SGML,我們來簡單了解一下,你只需要有個大致概念就可以。 

          SGML全稱是"Standard Generalized Markup Language"(通用標識語言標準)。看名稱就知道:它是標志語言的標準,也就是說所有標志語言都是依照SGML制定的,當然包括HTML。SGML的覆蓋面很廣,凡是有一定格式的文件都屬于SGML,比如報告,樂譜等等,HTML是SGML在網絡上最常見的文件格式。因此,人們戲稱SGML是HTML的"媽媽"。 


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


          到這里,你應該有點明白了:XML是用來創建定義類似HTML的標記語言,然后再用這個標記語言來顯示信息。 三. 使用XML有什么好處? 

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

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


          使用XML有什么好處?來看w3c組織(XML標準制定者)的說明: 

          XML使得在網絡上使用SGML語言更加"簡單和直接": 簡化了定義文件類型的過程,簡化了編程和處理SGML文件的過程,簡化了在Web上的傳送和共享。 


          1.XML可以廣泛的運用于web的任何地方; 

          2.XML可以滿足網絡應用的需求; 

          3.使用XML將使編程更加簡單; 

          4.XML便于學習和創建; 

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

          還是抽象了些。讓我們在后面的實例教程中慢滿體會XML的強大優勢吧! 

          四. XML很難學嗎?

          如果你有興趣學習XML,不禁會問:XML難嗎?學習XML需要什么樣的基礎?

          XML非常簡單,學習容易。如果你熟悉HTML,你會發現它的文檔和HTML非常相似,看同樣的示例文檔(例1):

          ?xml version="1.0"?>

          <myfile>

          <title>XML Quick Start</title>

          <author>ajie</author>

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

          <date>20010115</date>

          </myfile>

          第一行是一個XML聲明,表示文檔遵循的是XML的1.0 版的規范。

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

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

          <文章>

          <標題>XML輕松學習手冊</標題>

          <作者>ajie</作者>

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

          <日期>20010115</日期>

          </文章>

           

          這就是XML的文檔,任何掌握HTML的網友都可以直接寫出這樣簡單的XML文檔。

          另外,學習XML還必須掌握一種頁面腳本語言,常見的就是javascript和VB script。因為XML數據是使用script實現HTML中調用和交互的。我們看一個最簡單的例子(例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中調用XML數據</title>

          </head>

          <body bgcolor="#FFFFFF">

          <b>標題: </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輕松學習手冊</title>

          <author>ajie</author>

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

          <date>20010115</date>

          </myfile>


          3.將它們放在同一個目錄下,用IE5以上版本瀏覽器打開,可以看到效果。 學習并掌握一種script,你將真正了解到XML無比的強大的功能。

          五. XML和HTML的區別 

           

          XML和HTML都來自于SGML,它們都含有標記,有著相似的語法,HTML和XML的最大區別在于:HTML是一個定型的標記語言,它用固有的標記來描述,顯示網頁內容。比如< H1>表示首行標題,有固定的尺寸。相對的,XML則沒有固定的標記,XML不能描述網頁具體的外觀,內容,它只是描述內容的數據形式和結構。 

           


          這是一個質的區別:網頁將數據和顯示混在一起,而XML則將數據和顯示分開來。 

           

          我們看上面的例子,在myfile.htm中,我們只關心頁面的顯示方式,我們可以設計不同的界面,用不同的方式來排版頁面,但數據是儲存在myfile.xml中,不需要任何改變。 

           


          (如果你是程序員,你會驚訝的發現,這與模塊化面向對象編程的思想極其相似!其實網頁何嘗不是一種程序呢?) 

           

          正是這種區別使得XML在網絡應用和信息共享上方便,高效,可擴展。所以我們相信,XML做為一種先進的數據處理方法,將使網絡跨越到一個新的境界。

           

          六. XML的嚴格格式

           

          吸取HTML松散格式帶來的經驗教訓,XML一開始就堅持實行"良好的格式"。

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

          1.

          sample


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


          3.< td>sample< /TD>


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


          在XML文檔中,上述幾種語句的語法都是錯誤的。因為:

          1.所有的標記都必須要有一個相應的結束標記;

          2.所有的XML標記都必須合理嵌套;

          3.所有XML標記都區分大小寫;

          4.所有標記的屬性必須用""括起來;

          所以上列語句在XML中正確的寫法是

          1.
          sample

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

            另外,XML標記必須遵循下面的命名規則:

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

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

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

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

          在XML文檔中任何的差錯,都會得到同一個結果:網頁不能被顯示。各瀏覽器開發商已經達成協議,對XML實行嚴格而挑剔的解析,任何細小的錯誤都會被報告。你可以將上面的myfile.xml修改一下,比如將< email>改為< Email>,然后用IE5直接打開myfile.xml,會得到一個出錯信息頁面:


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

          <myfile>

          <title>XML輕松學習手冊</title>

          <author>ajie</author>

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

          <date>20010115</date>

          </myfile> 

          七. 關于XML的更多 

          好了,到現在你已經知道: 

          1.什么是XML; 
          2.XML,HTML,SGML之間的關系和區別; 
          3.XML的簡單應用。 

          恭喜你!你已經不再對XML一無所知,并且已經走在了網絡技術的前沿。整個學習過程好象并不很難哦:) 

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

          第二章 XML概念

          導言 

          經過第一章的快速入門學習,你已經知道了XML是一種能夠讓你自己創造標識的語言,它可以將數據與格式從網頁中分開,它可以儲存數據和共享數據的特性使得XML無所不能。如果你希望深入學習XML,系統掌握XML的來龍去脈,那么我們首先還是要回到XML概念的問題上來。XML(Extensible Markup Language),一種擴展性標識語言。"擴展性""標識""語言"。每一個詞都明確的點明了XML的重要特點和功能。我們來仔細分析: 

          一. 擴展性 
          二. 標識 
          三. 語言 
          四. 結構化 
          五. Meta數據 
          六. 顯示 
          七. DOM 

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

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

          一開始你也許會不適應,因為我們在學習HTML時,有固定的標記可以直接學習和使用;(很多人包括我自己都是邊分析別人的代碼和標識,邊建立自己的網頁),而XML卻沒有任何標記可以學,也很少有文檔的標記是一模一樣的。我們怎么辦?呵呵,沒有就自己創建呀。一旦你真正開始寫XML文檔,你會發現隨心所欲的創造新標記也是一份很有趣的事。你可以建立有自己特色的標記,甚至建立你自己的HTML語言。 

          擴展性使你有更多的選擇和強大的能力,但同時也產生一個問題就是你必須學會規劃。你自己要理解自己的文檔,知道它由哪幾部分組成,相互之間的關系和如何識別它們。 

          關于建立標識還需要說明一點,標識是描述數據的類型或特性,比如<width>,年齡<age>,姓名<name>等,而不是數據的內容,比如:<10pxl>,<18>,<張三>,這些都是無用的標記。如果你學過數據庫,你可以這樣理解,標識就是一種字段名。 

          二.標識---使用XML你可以識別文檔中的元素。 

          XML的第二個詞是"標識",這表明了XML的目的是標識文檔中的元素。 

          不論你是HTML,還是XML,標識的本質在于便于理解,如果沒有標識,你的文檔在計算機看來只是一個很長的字符串,每個字看起來都一樣,沒有重點之分。 

          通過標識,你的文檔才便于閱讀和理解,你可以劃分段落,列明標題。XML中,你更可以利用其擴展性 來為文檔建立更合適的標識。 

          不過,有一點要提醒大家注意:標識僅僅是用來識別信息,它本身并不傳達信息。例如這樣的HTML代碼: 

          <b>frist step<b> 
          這里<b>表示粗體,只用來說明是用粗體來顯示"frist step"字符,<b>本身并不包含任何實際的信息,在頁面上你看不到<b>,真正傳達信息的是"frist step "。 

          三.語言---使用XML你要遵循特定的語法來標識你的文檔。 

          XML第三個詞是"語言"。這表明了作為一種語言XML必須遵循一定的規則。雖然XML的擴展性允許你創建新標識,但它仍然必須遵循特定的結構,語法和明確的定義。 

          在計算機領域,語言常常表示一?quot;程序語言",用來編程實現一些功能和應用,但不是所有的"語言"都是用來編程的,XML就只是一種用來定義標識和描述信息的語言。 

          下面我們來深入了解一下XML應用的其本原理,可能會很枯燥,但是對于整體的理解很重要,你可以先快速過一遍,心里有一個模糊的概念,具體精髓則需要在實踐中慢慢領會。

          四.結構化---XML促使文檔結構化,所有的信息按某種關系排列。 

          "結構化"聽起來太抽象了,我們這樣理解,結構化就是為你的文檔建立一個框架,就象寫文章先寫一個提綱。結構化使你的文檔看起來不會雜亂無章,每一部分都緊密聯系,形成一個整體。 

          結構化有兩個原則: 
          1.每一部分(每一個元素)都和其他元素有關聯。關聯的級數就形成了結構。 
          2.標識本身的含義與它描述的信息相分離。 

          我們來看一個簡單的例子幫助理解: 
          <?xml version="1.0" encoding="GB2312"?>
          <myfile>
          <title>XML輕松學習手冊</title>
          <chapter>XML快速入門
          <para>什么是XML</para>
          <para>使用XML的好處</para>
          </chapter>
          <chapter>XML的概念
          <para>擴展性</para>
          <para>標識</para>
          </chapter>
          </myfile>
          這是本文的XML描述文檔,可以看到標識分三級關聯,非常清晰: 
          <myfile>
          <chapter>
          <para>
          ...
          </para>
          </chapter>
          </myfile>
          上面這樣的文檔結構,我們又稱之為"文檔樹",主干是父元素,如<myfile>,分支和頁是子元素,如<chapter>和<para>。 

          五.Meta數據(Metadata)---專業的XML使用者會使用meta數據來工作。 

          在HTML中我們知道可以使用meta標識來定義網頁的關鍵字,簡介等,這些標識不會顯示在網頁中,但可以被搜索引擎搜索到,并影響搜索結果的排列順序。 

          XML對這一原理進行了深化和擴展,用XML,你可以描述你的信息在哪里,你可以通過meta來驗證信息,執行搜索,強制顯示,或者處理其他的數據。 

          下面是一些XML metadata在實際應用中的用途: 

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

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

          六.顯示 

          單獨用XMl不能顯示頁面,我們使用格式化技術,比如CSS或者XSL,才能顯示XML標記創建的文檔。 

          我們在前面第一章講到XML是將數據和格式分離的。XML文檔本身不知道如何來顯示,必須有輔助文件來幫助實現。(XML取消了所有標識,包括font,color,p等風格樣式定義標識,因此XML全部是采用類似DHTML中CSS的方法來定義文檔風格樣式。),XML中用來設定顯示風格樣式的文件類型有: 

          1.XSL 

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

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

          2.CSS 

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

          3.Behaviors 

          Behaviors現在還沒有成為標準。它是微軟的IE瀏覽器特有的功能,用它可以對XML標識設定一些有趣動作。 

          七.DOM 

          DOM全稱是document object model(文檔對象模型),DOM是用來干什么的呢?假設把你的文檔看成一個單獨的對象,DOM就是如何用HTML或者XML對這個對象進行操作和控制的標準。 

          面向對象的思想方法已經非常流行了,在編程語言(例如java,js)中,都運用面向對象的編程思想。在XML中,就是要將網頁也作為一個對象來操作和控制,我們可以建立自己的對象和模板。與對象進行交流,如何命令對象,就要用到API。API全稱Application Programming Interface,它是訪問和操作對象的規則。而DOM就是一種詳細描述HTML/XML文檔對象規則的API。它規定了HTML/XML文檔對象的命名協定,程序模型,溝通規則等。在XML文檔中,我們可以將每一個標識元素看作一個對象---它有自己的名稱和屬性。 

          XML創建了標識,而DOM的作用就是告訴script如何在瀏覽器窗口中操作和顯示這些標識 

          上面我們已經簡要的講述了一些XML的基本原理,我們來看看它們之間的關聯以及它們是如何工作的,先看這里一張圖:


          此主題相關圖片如下:

          1.XML描述數據類型。例如:"King lear"是一個標題元素; 
          2.CSS儲存并控制元素的顯示樣式。例如:標題將被以18pt字體顯示 
          3.script腳本控制元素如何動作。例如:當一個title元素"out of stock",將被用紅色顯示。 
          4.DOM則為腳本和對象的交流提供一個公共平臺,并將結果顯示在瀏覽器窗口。 

          如果任何一個部分發生錯誤,都不會得到正確結果。 

          好了,看到這里,我們已經對XML是如何工作的有一個整體的大致的概念。通過這一章的學習,我們可能感覺到XML似乎更偏向數據處理,更方便程序員學習。實際情況也是這樣的,XML設計的目的就是用來方便的共享和交互數據的。下一章,我們將系統的了解關于XML的各種術語。歡迎您繼續瀏覽。

          XML輕松學習手冊(3)XML的術語

          第三章 XML的術語

          提綱: 


          導言 

          一.XML文檔的有關術語 

          二.DTD的有關術語 

          導言 


          初學XML最令人頭疼的就是有一大堆新的術語概念要理解。由于XML本身也是一個嶄新的技術,正在不斷發展和變化,各組織和各大網絡公司(微軟,IBM,SUN等)都在不斷推出自己的見解和標準,因此新概念漫天飛就不足為奇了。而國內又缺乏權威的機構或組織來對這些術語正式定名,你所看見的有關XML的中文教材大部分是靠作者本身的理解翻譯過來的,有些是正確的,有些是錯誤的,更加妨礙了我們對這些概念的理解和學習。 

          你下面將要看到的關于XML術語的解釋,也是作者本身的理解和翻譯。阿捷是以W3C組織發布的XML1.0標準規范和相關的正式說明文檔為根據來講述。可以確保這些理解是基本正確的,至少不是錯誤的。你如果想進一步閱讀和了解,我在本文的最后部分列明了相關資源的出處和鏈接,你可以直接訪問。好,我們轉入正題:

          一.XML文檔的有關術語

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


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

          <myfile>

          <title>XML輕松學習手冊</title>

          <author>ajie</author>

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

          <date>20010115</date>

          </myfile>


          XML文檔包含三個部分:

          1. 一個XML文檔聲明;

          2. 一個關于文檔類型的定義;

          3. 用XML標識創建的內容。


          舉例說明:

          <?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"?>就是一個XML文檔的聲明,第二行說明這個文檔是用filelist.dtd來定義文檔類型的,第三行以下就是內容主體部分。 
          我們來了解XML文檔中有關的術語:


          1.Element(元素):

          元素在HTML我們已經有所了解,它是組成HTML文檔的最小單位,在XML中也一樣。一個元素由一個標識來定義,包括開始和結束標識以及其中的內容,就象這樣:<author>ajie</author> 


          唯一不同的就是:在HTML中,標識是固定的,而在XML中,標識需要你自己創建。


          2.Tag(標識) 

          標識是用來定義元素的。在XML中,標識必須成對出現,將數據包圍在中間。標識的名稱和元素的名稱是一樣的。例如這樣一個元素:

          <author>ajie</author> 

          其中<author>就是標識。


          3.Attribute(屬性): 

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

          屬性是對標識進一步的描述和說明,一個標識可以有多個屬性,例如font的屬性還有size。XML中的屬性與HTML中的屬性是一樣的,每個屬性都有它自己的名字和數值,屬性是標識的一部分。舉例:

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

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

          <author>ajie

          <sex>female</sex>

          </author>

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


          4.Declaration(聲明) 

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

          <?xml version="1.0"?> 


          5.DTD(文件類型定義) 

          DTD是用來定義XML文檔中元素,屬性以及元素之間關系的。

          通過DTD文件可以檢測XML文檔的結構是否正確。但建立XML文檔并不一定需要DTD文件。關于DTD文件的詳細說明我們將在下面單獨列項。


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

          一個遵守XML語法規則,并遵守XML規范的文檔稱之為"良好格式"。如果你所有的標識都嚴格遵守XML規范,那么你的XML文檔就不一定需要DTD文件來定義它。

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

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

          其中你必須說明文檔遵守的XML版本,目前是1.0;其次說明文檔是"獨立的",它不需要DTD文件來驗證其中的標識是否有效;第三,要說明文檔所使用的語言編碼。默認的是UTF-8,如果使用中文,你需要設置為GB2312。

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

          良好格式的XML文檔的內容書寫時必須遵守XML語法。(有關XML語法我們將在下一章仔細講解)


          7.Valid XML(有效的XML)

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

          將XML文檔和它的DTD文件進行比較分析,看是否符合DTD規則的過程叫validation(確認)。這樣的過程通常我們是通過一個名為parser的軟件來處理的。

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

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

          和上面例子不同的,在standalone(獨立)屬性中,這里設置的是"no",因為它必須和相應的DTD一起使用,DTD文件的定義方法如下:

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

          其中:

          "!DOCTYPE"是指你要定義一個DOCTYPE;

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

          "SYSTEM/PUBLIC"這兩個參數只用其一。SYSTEM是指文檔使用的私有DTD文件的網址,而PUBLIC則指文檔調用一個公用的DTD文件的網址。

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

          我們還是用上面的例子,應該寫成這樣:

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

          <!DOCTYPE filelist SYSTEM "filelist.dtd"> 

          二.DTD的有關術語

          什么是DTD,我們上面已經簡略提到。DTD是一種保證XML文檔格式正確的有效方法,可以比較XML文檔和DTD文件來看文檔是否符合規范,元素和標簽使用是否正確。一個DTD文檔包含:元素的定義規則,元素間關系的定義規則,元素可使用的屬性,可使用的實體或符號規則。

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

          為什么要用DTD文件呢?我的理解是它滿足了網絡共享和數據交互,使用DTD最大的好處在于DTD文件的共享。(就是上文DTD說明語句中的PUBLIC屬性)。比如,兩個相同行業不同地區的人使用同一個DTD文件來作為文檔創建規范,那么他們的數據就很容易交換和共享。網上有其他人想補充數據,也只需要根據公用的DTD規范來建立文檔,就立刻可以加入。

          目前,已經有數量眾多的寫好的DTD文件可以利用。針對不同的行業和應用,這些DTD文件已經建立了通用的元素和標簽規則。你不需要自己重新創建,只要在他們的基礎上加入你需要的新標識。

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

          調用DTD文件的方法有兩種:

          1.直接包含在XML文檔內的DTD

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

          我們有一個XML文檔:

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

          <myfile>

          <title>XML輕松學習手冊</title>

          <author>ajie</author>

          </myfile>

          我們在第一行后面插入下面代碼就可以:

          <!DOCTYPE myfile [

          <!ELEMENT title (#PCDATA)>

          <!ELEMENT author (#PCDATA)>

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

          ]>
           

          2.調用獨立的DTD文件

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

          <!ELEMENT myfile (title, author)>

          <!ELEMENT title (#PCDATA)>

          <!ELEMENT author (#PCDATA)>
           

          然后在XML文檔中調用,在第一行后插入:

          <!DOCTYPE myfile SYSTEM "myfile.dtd">
           

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


          下面我們來了解DTD有關的術語:

          1.Schema(規劃) 

          schema是數據規則的描述。schema做兩件事:

          a.它定義元素數據類型和元素之間的關系;

          b.它定義元素所能包含的內容類型。

          DTD就是關于XML文檔的一個schema。

          2.Document Tree(文檔樹) 

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

          <?xml version="1.0"?>

          <filelist> 

          <myfile>

          <title>...</title>

          <author>...</author>

          </myfile>

          </filelist>

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

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

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

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

          XML的parser發展為兩類:一種是"非確認類paeser",只檢測文檔是否遵守XML語法規則,是否用元素標識建立了文檔樹。另一種是"確認類paeser",它不但檢測文檔語法,結構樹,而且比較解析你使用的元素標識是否遵守了相應DTD文件的規范。

          Parser能獨立使用,也可以成為編輯軟件或瀏覽器的一部分。在后面的相關資源列表里,我列出了當前比較流行的一些parsers。


            好了,通過第三章的學習,我們已經了解了一些XML和DTD的基本術語,但是我們還不知道怎樣來寫這些文件,需要遵循什么樣的語法,在下一章,將重點介紹有關撰寫XML和DTD文檔的語法。請繼續瀏覽,謝謝!

          XML輕松學習手冊(4)XML語法

          第四章 XML語法 

          提綱: 

          一.XML語法規則 
          二.元素的語法 
          三.注釋的語法 
          四.CDATA的語法 
          五.Namespaces的語法 
          六.entity的語法 
          七.DTD的語法 

          通過前面三章的學習,我們已經對什么是XML,它的實現原理以及相關的術語有所了解。接下來我們就開始學習XML的語法規范,動手寫自己的XML文檔。

          一.XML語法規則

          XML的文檔和HTML的原代碼類似,也是用標識來標識內容。創建XML文檔必須遵守下列重要規則:
          規則1:必須有XML聲明語句
          這一點我們在上一章學習時已經提到過。聲明是XML文檔的第一句,其格式如下:
          <?xml version="1.0" standalone="yes/no" encoding="UTF-8"?> 
          聲明的作用是告訴瀏覽器或者其它處理程序:這個文檔是XML文檔。聲明語句中的version表示文檔遵守的XML規范的版本;standalone表示文檔是否附帶DTD文件,如果有,參數為no;encoding表示文檔所用的語言編碼,默認是UTF-8。

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

          規則3:注意你的大小寫
          在XML文檔中,大小寫是有區別的。<P>和<p>是不同的標識。注意在寫元素時,前后標識大小寫要保持一樣。例如:<Author>ajie</Author>,寫成<Author>ajie</author>是錯誤的。
          你最好養成一種習慣,或者全部大寫,或者全部小寫,或者大寫第一個字母。這樣可以減少因為大小寫不匹配產生的文檔錯誤。

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

          規則5:所有的標識必須有相應的結束標識
          在HTML中,標識可能不是成對出現的,比?lt;br>。而在XML中規定,所有標識必須成對出現,有一個開始標識,就必須有一個結束標識。否則將被視為錯誤。

          規則6:所有的空標識也必須被關閉
          空標識就是標識對之間沒有內容的標識。比如
          ,<img>等標識。在XML中,規定所有的標識必須有結束標識,針對這樣的空標識,XML中處理的方法是在原標識最后加/,就可以了。例如:

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


          第四章 XML語法

          二.元素的語法 

          元素由一對標識以及其中的內容組成。就象這樣:ajie。元素的名稱和標識的名稱是一樣的。標識可以用屬性來進一步描述。 

          在XML中,沒有任何保留字,所以你可以隨心所欲的用任何詞語來作為元素名稱。但是也必須遵守下列規范: 

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

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

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

          4.名稱中不能包含空格 

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

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

          1.名稱中不要使用"."。因為在很多程序語言中,"."是作為對象的屬性,例如:font.color。同樣的原因"-"也最好不要用,必須使用的,以"_"代替; 

          2.名稱盡量簡短。 

          3.名稱的大小寫盡量采用同一標準。 

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

          另外,補充一點關于屬性的說明。在HTML中,屬性可以用來定義元素的顯示格式,比如:<font color="red">word</font>將把word顯示為紅色。而在XML中,屬性只是對標識的描述,與元素內容的顯示無關。例如同樣一句:<font color="red">word</font>,并不會將word顯示為紅色。(那么,有網友會問:如何在XML中將文字顯示為紅色呢?這就需要使用CSS或者XSL,我們在下面詳細講述。) 

          三.注釋的語法 

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

          注釋的語法如下: 

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

          可以看到,它和HTML中的注釋語法是一樣的,非常容易。養成良好的注釋習慣將使你的文檔更加便于維護,共享,看起來也更專業。 

          四.CDATA的語法 

          CDATA全稱character data,翻譯為字符數據。我們在寫XML文檔時,有時需要顯示字母,數字和其它的符號本身,比如"<",而在XML中,這些字符已經有特殊的含義,我們怎么辦呢?這就需要用到CDATA語法。語法格式如下: 

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

          例如: 

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

          在頁面上顯示的內容將是"<AUTHOR sex="female">ajie</AUTHOR>" 


          第四章 XML語法

          五.Namespaces的語法 

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

          六.entity的語法

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

          七.DTD的語法 

          DTD是"有效XML文檔"的必須文件,我們通過DTD文件來定義文檔中元素和標識的規則及相互關系。如何建立一個DTD文件呢?讓我們一起來學習: 

          1.設置元素 

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

          說明: 

          "<!ELEMENT" 是元素的聲明,說明你要定義的是一個元素; 

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

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

          2.元素規則表: 


          此主題相關圖片如下:

          另外,我們還可以為元素定義屬性,因為我們不推薦使用屬性,在這里就不詳細展開了。

           最后,我們來總結一些前四章學習的內容,寫一個包含DTD,XML,以及Script的簡單實例,便于讀者理解:
          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輕松學習手冊</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中調用XML數據</title>
          </head>
          <body bgcolor="#FFFFFF">
          <b>標題: </b>
          <span id="title"></span><br>
          <b>作者: </b>
          <span id="author"></span><br>
          </body>
          </html>

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

          XML輕松學習手冊(5)XML實例解析

          第五章:XML實例解析 

          提綱: 

          一:實例效果 

          二:實例解析 
            1.定義新標識。
            2.建立XML文檔。
            3.建立相應的HTML文件。 

          XML在不同領域有著廣泛的應用,比如在科技領域的MathML,無線通信應用的WML,在網絡圖象方面的SVG等等,我們這里側重討論XML在web上的應用。XML在web上應用主要是利用其強大的數據操作能力。一般用XML配合javascript和asp等服務器端程序,可以實現網絡上幾乎所有的應用需求。 

          考慮講解方便,我們在下面介紹一個簡單的實例,不包含服務器端程序。目的在于讓您對XML的數據操作能力有一個感性的認識。 

          好,我們首先[ 點擊這里 ]來看實例的效果。(請用IE5.0以上版本瀏覽器打開) 

          這是一個簡單的CD唱片數據檢索功能。你通過點擊"上一張","下一張"可以看到單張CD的有關信息。這樣的效果我們原來用兩種方法可以實現: 

          1.利用DHTML,將數據隱藏在不同的層中,通過鼠標事件依次顯示; 

          2.利用后臺程序(如ASP,CGI,PHP,JSP等),調用服務器端的數據。 

          但是在這個實例中,我們打開頁面原代碼可以看到,其中沒有用DHTML的DIV,也沒有表單的action,它完全是用XML來實現的。下面我們來分析它的制作過程:

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

          <!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包含多個CD子元素,而子元素CD又依次包含Title, Artist, Year, Country, Company, Price 六個子元素,它們的內容都定義為文本(字符,數字,文本)。(注:具體的語法說明可以看上一章關于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"?>聲明語句表明這是一個XML文檔,它的格式遵守XML 1.0標準規范。然后是文檔內容,結構樹非常清晰:
          <CATALOG>
          <CD>
          ...... 
          </CD>
          <CD>
          ...... 
          </CD>

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


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

          定義一個object,ID名為xmldso。然后在head區用js引入xml數據:

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

          2.捆綁數據。
          然后將用<SPAN>標識來將XML數據綁定在表格中。其中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.動作操作。
          最后,為數據提供瀏覽按鈕:
          <INPUT TYPE=button value="上一張CD" onCLICK="moveprevious()">
          <INPUT TYPE=button value="下一張CD" onCLICK="movenext()">

          并利用js來完成兩個鼠標點擊功能:movenext()和moveprevious()。在head區加入如下代碼:

          <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文件,你就看見和上面實例一樣的效果了。

          好,到今天為止,我們已經學習了關于XML的不少知識,我們來總結一下前面五個章節,分別是XML快速入門,XML的概念原理,XML的術語,XML的語法和本章的實例解析。到這里,教程部分就結束了。在寫作過程中,阿捷盡最大努力將有關XML概念講得通俗易懂,盡量把自己的理解告訴給大家,但因為本人學習XML時間也不長,對整個XML的技術把握還不夠系統和深入,所以難免有疏漏的地方,請大家指正和諒解,謝謝!
          <完>

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

          金山詞霸2000使用密技兩則

          金山詞霸2000使用密技兩則

          loveaniu

              
           

            金山詞霸這么好的軟件相信大家都用過吧,可是小生在近日的使用過程中卻遇到了兩個棘手的問題,經過仔細分析,終于解決,呵呵,好東東當然不能獨享,大家請看:

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

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

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

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

          硅谷動力eNet

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

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

          作者 Tobias Hill



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

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

        1. 這些 applet 來自同一個服務器上的同一個目錄中。
        2. 這些 applet 運行于同一個瀏覽器窗口中的同一個頁面上。

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

          試考慮這樣一種情況:

          您剛編好一個很好的股票市場交易 applet,并決定為它編寫一個良好的幫助系統。您希望幫助系統也是一個 applet,并希望將它與股票市場交易 applet 在不同的瀏覽器框架中運行。您作出這個決定可能是出于網站結構方面的考慮,也可能是出于始終顯示幫助系統的需要。另外,您希望使幫助系統根據用戶當前在股票交易 applet 中進行的操作轉至正確的信息/指導(就像 Microsoft Office 套件中的“回形針”一樣)。您甚至計劃在幫助系統中編制向導,這些向導可遠程指出問題,并可遠程執行股票市場交易 applet 中的任務。

          這一方案中體現的思想很不錯。但是,因為這兩個 applet 處于不同的頁面上,所以 AppletContext 中的 Java API 無法幫助您實現這個想法 -- 但這篇技巧可以幫助您。


          使用 AppletContext API

          在說明 applet 間通信的替代機制前,我將首先簡要說明一下 getApplet 和 getApplets 這兩個方法是如何工作的。一個 applet 通過使用 getApplet 方法可以按名稱找到同一個 HMTL 頁面中的另一個 applet,而通過使用 getApplets 方法可以找到同一個頁面上的所有 applet。這兩個方法如果成功執行,則會向調用者返回一個或多個 Applet 對象。調用者一旦找到一個 Applet 對象,它就可能調用這個 Applet 的公用方法。

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

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

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

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

          當發出調用的 applet 在它所在的同一個 HTML 頁面上檢索到一個或幾個 applet 之后,它就可以調用這些 applet 的公用方法。

          使用靜態數據結構

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

          由于運行時環境是共享的,因此所有 applet 實例都可以訪問靜態域和靜態結構,這樣這些靜態域和結構就可用來在不同 applet 之間傳遞信息。

          applet 不僅可以存儲諸如整數、字符和字符串這樣的簡單數據類型,而且每個 applet 都可以將其自身(實例)的一個引用存儲在一個靜態域(可能在它自己的類中)中。任何 applet 都可以訪問這個域,從而獲得指向這個實例的引用。

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

          您現在希望授予 AppletA 訪問 AppletB 的公用方法的權限。您必須讓 AppletB 將其自身的一個引用存儲在一個靜態公用域中,就像下面這樣:
          PHP代碼:
          public class AppletB {
          public static
          AppletB selfRef = null; // 初始歸零

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

          現在您就可以從 AppletA 訪問 AppletB 的實例了:
          PHP代碼:
          public class AppletA {
          AppletB theOtherApplet = null;

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

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

          這就是我們所要做的全部工作。因為運行時環境是由不同的 applet 共享的,所以即便 applet 不在同一個頁面上,這個方法同樣奏效。

          值得注意的一點是,上面的代碼并沒有處理在啟動 AppletB 之前就調用 AppletA 中的 callAppletB 方法的情況。如果發生這種情況,則 selfRef 將是 null,這樣不能進行任何通信。

          一種更通用的方法

          當然,還有一種更通用的方法。您可以創建這樣一個類,創建它的唯一目的就是在靜態數據結構中存儲 applet 的引用。稍后您將看到的 AppletList 類就屬于這種情況。希望其他 applet 訪問自己的公用方法的 applet 實例通過 AppletList 將自己注冊。按照 AppletContext.getApplet(string name) 中的模式,每個注冊項都與一個字符串相關聯。當一個 applet 調用某個 applet 的引用時,這個字符串就起關鍵字的作用。

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

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

          當該 applet 停止運行時,您必須緊記在 AppletList 中撤銷注冊:
          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: }

          要獲得說明如何使用這個類的示例,請在參考資源中下載 exampleCode.zip。

          局限性

          正如我在前面提到的那樣,必須從同一個 codebase 中加載這些 applet。此外,如果瀏覽器的兩個不同副本正在運行,并且 applet 被加載到每個副本中,則 applet 可能無法彼此通信(取決于瀏覽器的版本和設置),因為它們可能不再共享同一個運行時環境。但是,如果是瀏覽器本身衍生出新的瀏覽器窗口,則沒有任何問題。

          該技巧已在幾個平臺和幾個瀏覽器版本中通過測試,但在某些配置中每個 applet 的運行時環境可能是獨立的。該技巧已在下面的操作系統和瀏覽器組合中通過測試:
        3. Windows2000: Internet Explorer 5.0,Internet Explorer 5.5,Netscape Navigator 4.72,Opera 4.01
        4. Windows 98: Internet Explorer 4.72,Internet Explorer 5.0,Netscape Navigator 4.02
        5. Mac OS 9: Internet Explorer 4.5,
        6. Netscape Navigator 4.5
          Red Hat 6.2: Netscape Navigator 4.73

          小結

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

          作者簡介

          Tobias Hill 是 Citerus 的創辦者之一,該公司以瑞典為基地,致力于在 Java 平臺上構建因特網、內部網和外部網系統。Hill 從 1996 年開始用 Java 編程,參與了許多項目,從為自主控制的機器人編程到開發在線焰火明信片制作程序等等。

          參考資源

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

          [轉貼]2005年11月程序語言世界排行榜-Java居首位

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



          轉載:轉載請保留本信息,本文來自http://www.matrix.org.cn/resource/news/315.html


          版權申明:轉載必須保留以下信息
          作者:cleverpig

          可以自由轉載, 轉載請保留下面的作者信息:

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


          近日來,在TIOBE程序員社區中公布了其2005年11月的程序語言排行榜。這得注意的是PHP即將超過C++成為了排行榜的老三!而Java作為開源先鋒首當其沖的成為了龍頭老大,并且仍然保持著很好的增長勢頭。

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

          1。世界前20位語言排行榜:




          2。世界前10位語言在前五年內長期發展趨勢圖:




          3。世界前30-50位語言排行榜:







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

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

          你是否需要XML?

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


          XML如何被使用?

          XML對于描述那些要被應用程序所使用的數據來說是一種非常出色的工具。這是由于絕大多數基于網絡的應用軟件是使用這些數據制作出來的,而對于XML來說,它已經發展成為了網絡服務的一種標準。



          你可以在企業里的許多層次上都使用XML。XML經常被用來存儲那些會出現在網絡站點的內容。你還可以把XML用作內部的信息存儲庫,這個庫是可以被第三方應用軟件所訪問的,而且不需要具備數據庫相關的功能。



          從內部移動到外部應用軟件,XML可以讓你和合作者之間以一種有協議的方式進行數據交換。你可以維持你系統原來的狀態,而不用去考慮合作者系統的結構。

          采用XML的有利條件

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



          很明顯,XML是由于它本身的簡便易用以及節省時間的信息集中化管理而流行起來的。



          在適當的環境里,使用XML還有其它的一些好處。當處理網絡應用軟件的時候,把數據裝入XML文件然后再由應用軟件進行分析的方法能夠有效的簡化保持維護的復雜性。這就不用再更換菜單、頁面標題以及內容了。在許多情況下,只需簡單的編輯XML文件就能夠完成這些改變。



          XML還可以方便的用于擴展存儲于文件中的內容和內容的類型。雖然這可能會比訪問數據庫要花去更多的時間,但是如果只有相關的信息被存儲在文件中的話,那么,處理的時間則會被縮短。你可以使用編程語言中的查找與分類功能來實現,而不是使用數據庫中的相關功能。但是,總的來說,XML的內容是有意被顯示出來的,而且該過程也不是必需的。

          網絡服務對P2P的貢獻

          另一個很大的好處是你可以簡單的就加入相關數據的子集,能夠禁止系統訪問那些沒有被使用的信息。

          采用XML的缺點

          當然,所有的事情都有兩面性,使用XML也有一些缺點,這些缺點會讓你在真正使用它之前會再審慎的考慮一番。舉例來說,XML有可能會產生非常不便于維護的相當巨大的數據量。由于這個原因,人們通常會把數據存儲在數據庫中,然后才把輸出的相關信息送入XML。在這種情況下,你實際上并不把信息保存在XML文件中。這種情況是否被看作是一個不利條件還不確定,但是還是有必要在作決定之前考慮一下這種情況。



          XML有一個明顯的缺點,就是缺少完整的安全保護。一個共享的XML文件對于請求的回應是自動的。如果你把該文件加密以尋求安全保護,那么,接收端就不能夠自動的識別出它的內容。XML有幾種可以使用的安全標準,但是還沒有最后確定選擇哪一個標準。



          因此,公司就需要限制他們的文件在VPN或者外部網絡上的發布。否則這些公司就會冒一定的風險,因為任何人都知道在國際互聯網上如何瀏覽包含有重要信息的XML文件。



          控制訪問也會帶來一系列的問題。到安全標準被真正實現之前,唯一可信賴的方法就是為不同的人提供你信息的不同子集,這樣做能夠為不同的人創建分開的XML文件。如果你試圖把XML作為企業B2B解決方案主要組成部分,并且還需要為每一方都進行用戶化,那么,選擇使用數據庫可能比選擇使用包含大量XML文件的方式要好得多。

          如何做決定?

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



          然而,如果你處理的是比較敏感而且重要的數據,又或者你正在把你數據的不同部分傳送給不同的目標,那么,你就會希望能夠得到更多的安全保護。如果你的解決方案中包含為相似的服務創建多個XML文件,你的選擇可能有些超前了,而且有可能會導致維護上的災難。



          對于local應用軟件,你可能會需要考慮一下具體配置的每一個細節。如果安全和訪問都不是問題的話,考慮一下,把你的信息都集中到一個XML源是否能夠讓你從中獲得好處。如果你需要顯示這些數據,并且還會出現在不同的地方,那么,XML對于網絡服務來說就是一個很好的選擇。

          總結

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

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

          快速精確的對數學表達式求值

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

          W3Eval 的方法與傳統計算器不同,卻和人類的計算方式一致。當您用傳統的計算器計算時,每輸入一個新數,前一個數就看不到了。如果在輸入一個長表達式中出了錯,就得全部重來。有了 W3Eval,您就能看到參與計算的所有東西,還能輕松的編輯表達式。它獨特的能力(一步一步的對表達式求值)非常容易實現,因為用戶能看到求值的每一步,包括臨時結果。

          本文將讓您從頭至尾認識 W3Eval 功能性的要點;您將看到一些用于表達式求值的代碼。不過,我們還是先看看表達式求值的經典算法,這樣您就會明白 W3Eval 方法的差異究竟有多少。

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

          表達式表示法
          算術表達式中最常見的表示法形式有中綴、前綴后綴表示法。中綴表示法是書寫表達式的常見方式,而前綴和后綴表示法主要用于計算機科學領域。

          中綴表示法
          中綴表示法是算術表達式的常規表示法。稱它為中綴表示法是因為每個操作符都位于其操作數的中間,這種表示法只適用于操作符恰好對應兩個操作數的時候(在操作符是二元操作符如加、減、乘、除以及取模的情況下)。對以中綴表示法書寫的表達式進行語法分析時,需要用括號和優先規則排除多義性。



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



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



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



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

          求值過程分為三個步驟:
          1. 表達式語法分析
          2. 表達式檢查
          3. 一步一步的求值
          表達式語法分析
          W3Eval 的數學表達式由數字、變量、操作符、函數和括號組成。除了缺省的十進制計數制外 W3Eval 還支持二進制、八進制和十六進制。這些以其它計數制計數的數必須以 # 開頭,并緊跟 bo 或者 h 來分別表示二進制、八進制或十六進制。

          W3Eval 的變量是不限長度的大寫字母和數字序列,其首字符必須是字母。W3Eval 有一些預定義的變量,不過它也支持用戶定義的變量。

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

          W3Eval 的符號(token)是算術表達式的組成部分;記號(mark) 是獨立的字符, 由 applet 使用,作為識別各種符號的內部標志。每種符號有唯一的 mark 與之對應。W3Eval 的表達式由表 1 所示的符號組成。

          表 1. W3Eval 的符號
          Token Mark
          十進制數 Double
          二進制數 String
          十六進制數 String
          八進制數 String
          變量 Variable
          函數 Function
          操作符 Operator
          開括號 String
          閉括號 String
          逗號 String


          用以表示函數、操作符和變量類的定義如清單 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+""; } }
          表達式檢查
          檢查正規表達式正確性的所有代碼都在一個獨立的類中。詳細的表達式檢查能夠確定錯誤確切的類型和位置。 錯誤檢查有七類:

          括號檢查。W3Eval 的表達式可以包含三種括號:標準圓括號、方括號和花括號。如果表達式包含相同數量的開括號和閉括號,并且每個開括號與一個相應的同種閉括號相匹配,則表達式的括號語法正確。三種括號在語義上等價,如下面的代碼段所示。

          清單 3. 三種括號


          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 檢查。檢查表達式語法。確保表達式所有部分都被認為是合法的。

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





          清單 4. 正確的表達式開頭的檢查


          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; }


          表達式末尾的檢查。確保表達式以合法符號結束。不可以用操作符、函數、逗號或開括號作為表達式結束符。

          符號序列的檢查。檢查表達式中的符號序列。在下面的表格中,若 X 軸上的符號和 Y 軸上的符號對應的交界處用 X 作了記號,則相應 X 軸上的符號可以接在 Y 軸上符號的后面。

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


          函數檢查。確保表達式中所有函數的自變量數量正確。

          逗號檢查。逗號只能用于分隔函數的自變量。若用于表達式其它地方,就不合法。

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

          步驟 1:為避免括號的處理,W3Eval 確定哪個子表達式處于嵌套最深的那對括號中。這項任務需要兩步。第一步,W3Eval 必須找出第一個閉括號:

          清單 5. 找出第一個閉括號


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





          清單 6. 找出匹配的開括號


          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:要實現求值的單步執行,W3Eval 在嵌套最深的那對括號中找出優先級最高的操作符。(操作符的優先級已硬編碼到 applet 中;請參閱參考資料以獲取完整的代碼清單。)

          清單 7. 找出優先級最高的操作符


          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:如果表達式中不包含其它括號,求值的過程就完成。如果表達式包含括號,但不包含操作符,則存在需要求值的函數。

          清單 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:所有的操作符都是二元的,也就是說第一個操作數位于操作符之前,第二個操作符位于操作符之后。

          清單 9. 獲取操作數并執行運算


          ...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 );...
          操作數可以是變量,還可以是十進制、十六進制、八進制或二進制數。

          清單 10. 獲取操作數


          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 ); }
          接下來的方法將不同計數制的數轉化為十進制的形式。

          清單 11. 將數轉化為十進制數


          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; }
          一旦確定操作數和操作符后,就可以執行運算了,如清單 12 所示。

          步驟 5:在這步中,W3Eval 從向量中除去用過的符號并在同一位置放入結果。對于函數求值這類情況,除去的是函數、括號、自變量和逗號;而對于操作符求值這類情況而言,除去的則是操作數和操作符。

          步驟 6:在求值的這一步,W3Eval 從表達式中除去冗余括號。

          清單 13. 除去冗余括號


          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:在求值的最后一步,向量中剩余的符號被結合到字符串,并在屏幕上顯示。

          清單 14. 結合符號并顯示結果


          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; }
          結論
          本文分析了一個 applet ,它能一步一步的對算術表達式求值。同時還按順序回顧了最有意思的代碼片段,并論述了兩種不同的表達式求值方法。

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

          我希望您會發現 W3Eval 是個對表達式求值有益的在線工具,它在某種程度上比經典的方法更簡單自然。我還期待這里談到的代碼和算法使您明白 Java 語言有助于處理數學問題。

          參考資料
          • W3Eval applet 是免費的,它的幫助有助于您解決問題。
          • 這張表格展示了 W3Eval 操作符的優先級
          • 請閱讀波蘭數學家 Jan Lukasiewicz 的傳記。
          • Donald Knuth,計算機科學領域卓越的學者,曾詳盡的就算法的設計和分析撰寫和演講。他的主頁提供最近出版的有關其作品的論文和信息的鏈接。
          • 有興趣隨意編寫 applet 嗎?可以查看我們的教程 Building a Java applet(developerWorks,1999 年)以獲得一步一步的指導。
          • 您會覺得 Java FAQ 很有用。
          • 還有很多有關 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 月)包含有益的關于集合的信息。
          • 學習 Martin Bastiaan 的“A Walk in the Park”(developerWorks,1998 年 1 月),了解更多有關 applet 的知識。
          • VisualAge for Java 使 applet 的開發變得輕而易舉。
          • developerWorks Java 技術專區查找更多 Java 參考資料。

          關于作者
          Nikola Stepan 是 ABIT Ltd. 的軟件工程師,他在那里從事銀行業軟件的設計和開發。他有廣博的信息系統方面的學術背景和豐富的編程經驗(從低級編程到信息系統)。他特別喜歡面向對象編程語言、關系數據庫、因特網編程和系統編程。他于 1999 年在克羅地亞 Varazdin 的 Faculty of Organisation and Informatic 獲得信息系統學士學位。他會說克羅地亞語、英語和一點德語。請通過 nikola.stepan@vz.tel.hr 與 Nikola 聯系。
          __________________
          “日本固有新奇的武器,我當以熱血應付;日本固有猛烈的槍炮,我當以頭顱拼擋。”
          “作為軍人,志在以身報國,茍有一線之機不減,自應鼓舞勇氣,而為國家盡其最后之犧牲。凡為官為吏,不過一時職業之選擇,民族之保存,始為骨頭之歸宿!”

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

          僅列出標題
          共3頁: 上一頁 1 2 3 下一頁 
          主站蜘蛛池模板: 晋江市| 措勤县| 石屏县| 尚义县| 昂仁县| 花垣县| 山丹县| 锦屏县| 韶山市| 古交市| 宾阳县| 双鸭山市| 台山市| 普定县| 临西县| 汉沽区| 喀什市| 武山县| 台山市| 金坛市| 通道| 双峰县| 嵊州市| 平凉市| 溆浦县| 台北县| 安顺市| 方正县| 凤冈县| 山西省| 遵义县| 托克托县| 玉林市| 金昌市| 收藏| 呼和浩特市| 监利县| 曲水县| 宜良县| 中西区| 宁安市|