Luben Park

          Java Ben 成長之路

          2005年12月27日 #

          表名作為參數(shù)傳遞的存儲(chǔ)過程寫法

          SET QUOTED_IDENTIFIER ON
          GO
          SET ANSI_NULLS ON
          GO

          ?

          --=================================================================
          -- 描述:~~~~~~~~~~~~~~~~~~~~~~~~~~~
          -- 作者:魯湘
          -- @tableName?? 該模板對(duì)應(yīng)的數(shù)據(jù)庫表
          -- @RecordID??? 業(yè)務(wù)處理需要尋找表中記錄的ID號(hào)碼
          --=================================================================

          ALTER??? PROCEDURE WF_QingJia
          ? ?(@tableName varchar(50),@recordID varchar(50))
          AS
          -- 獲取表中的業(yè)務(wù)數(shù)據(jù)值
          DECLARE @money varchar(100),? -- 業(yè)務(wù)邏輯需要的值
          ?@sqls nvarchar(4000)? -- 保存組合SQL語句

          SET @sqls='SELECT @a=Money FROM '+@tableName +' WHERE ID ='+@recordID

          EXECUTE sp_executesql @sqls,N'@a varchar(50) output',@money output

          -- 根據(jù)值進(jìn)行相應(yīng)的業(yè)務(wù)處理
          print @money
          UPDATE WF_FormBill SET [Money]='真的被處理了' WHERE [ID]=@recordID

          ?

          GO
          SET QUOTED_IDENTIFIER OFF
          GO
          SET ANSI_NULLS ON
          GO

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

          [轉(zhuǎn)]經(jīng)典SQL語句--收藏 http://blog.ourtw.com/article.php?tid_600.html

          經(jīng)典SQL語句--收藏
          [個(gè)人收藏]經(jīng)典SQL語句.值得收藏
          精典的SQL語句,推薦收藏
          在網(wǎng)上經(jīng)常轉(zhuǎn),常常看到有些人為了求得某些SQL語句而焦頭爛額,現(xiàn)在我特別把自己收藏的一些比較精典的SQL拿出來和大家分享一下

          1. 行列轉(zhuǎn)換--普通

          假設(shè)有張學(xué)生成績表(CJ)如下
          Name ? Subject ? Result
          張三 ? 語文 ? ? 80
          張三 ? 數(shù)學(xué) ? ? 90
          張三 ? 物理 ? ? 85
          李四 ? 語文 ? ? 85
          李四 ? 數(shù)學(xué) ? ? 92
          李四 ? 物理 ? ? 82

          想變成 ?
          姓名 ? 語文 ? 數(shù)學(xué) ? 物理
          張三 ? 80 ? 90 ? 85
          李四 ? 85 ? 92 ? 82

          declare @sql varchar(4000)
          set @sql = ''select Name''
          select @sql = @sql + '',sum(case Subject when ''''''+Subject+'''''' then Result end) [''+Subject+'']''
          from (select distinct Subject from CJ) as a
          select @sql = @sql+'' from test group by name''
          exec(@sql)

          2. 行列轉(zhuǎn)換--合并

          有表A,
          id pid
          1 ? 1
          1 ? 2
          1 ? 3
          2 ? 1
          2 ? 2
          3 ? 1
          如何化成表B:
          id pid
          1 1,2,3
          2 1,2
          3 1

          創(chuàng)建一個(gè)合并的函數(shù)
          create function fmerg(@id int)
          returns varchar(8000)
          as
          begin
          declare @str varchar(8000)
          set @str=''''
          select @str=@str+'',''+cast(pid as varchar) from 表A where id=@id set @str=right(@str,len(@str)-1)
          return(@str)
          End
          go

          --調(diào)用自定義函數(shù)得到結(jié)果
          select distinct id,dbo.fmerg(id) from 表A

          3. 如何取得一個(gè)數(shù)據(jù)表的所有列名

          方法如下:先從SYSTEMOBJECT系統(tǒng)表中取得數(shù)據(jù)表的SYSTEMID,然后再SYSCOLUMN表中取得該數(shù)據(jù)表的所有列名。
          SQL語句如下:
          declare @objid int,@objname char(40)
          set @objname = ''tablename''
          select @objid = id from sysobjects where id = object_id(@objname)
          select ''Column_name'' = name from syscolumns where id = @objid order by colid

          是不是太簡單了? 呵呵 不過經(jīng)常用阿.

          4. 通過SQL語句來更改用戶的密碼

          修改別人的,需要sysadmin role ?
          EXEC sp_password NULL, ''newpassword'', ''User''

          如果帳號(hào)為SA執(zhí)行EXEC sp_password NULL, ''newpassword'', sa

          5. 怎么判斷出一個(gè)表的哪些字段不允許為空?

          select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where IS_NULLABLE=''NO'' and TABLE_NAME=tablename

          6. 如何在數(shù)據(jù)庫里找到含有相同字段的表?
          a. 查已知列名的情況
          SELECT b.name as TableName,a.name as columnname
          From syscolumns ? a INNER JOIN ? sysobjects b ?
          ON a.id=b.id ?
          AND b.type=''U'' ?
          AND a.name=''你的字段名字''

          b. 未知列名查所有在不同表出現(xiàn)過的列名
          Select o.name As tablename,s1.name As columnname
          From syscolumns s1, sysobjects o
          Where s1.id = o.id
          ? And o.type = ''U''
          ? And Exists (
          ? ? Select 1 From syscolumns s2 ?
          ? ? Where s1.name = s2.name ?
          ? ? And s1.id <> s2.id
          ? ? )

          7. 查詢第xxx行數(shù)據(jù)

          假設(shè)id是主鍵:
          select *
          from (select top xxx * from yourtable) aa
          where not exists(select 1 from (select top xxx-1 * from yourtable) bb where aa.id=bb.id)

          如果使用游標(biāo)也是可以的
          fetch absolute [number] from [cursor_name]
          行數(shù)為絕對(duì)行數(shù)

          8. SQL Server日期計(jì)算
          a. 一個(gè)月的第一天
          SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)
          b. 本周的星期一
          SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)
          c. 一年的第一天
          SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)
          d. 季度的第一天
          SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)
          e. 上個(gè)月的最后一天
          SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))
          f. 去年的最后一天
          SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0))
          g. 本月的最后一天
          SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))
          h. 本月的第一個(gè)星期一
          select DATEADD(wk, DATEDIFF(wk,0, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
          ? ? ? ? ? ? ? ? ? ? dateadd(dd,6-datepart(day,getdate()),getdate()) ? ?
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ), 0) ? ?
          i. 本年的最后一天
          SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))。
          -----------------------------------------------------------------------
          1.按姓氏筆畫排序:
          Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as

          2.數(shù)據(jù)庫加密:
          select encrypt(''原始密碼'')
          select pwdencrypt(''原始密碼'')
          select pwdcompare(''原始密碼'',''加密后密碼'') = 1--相同;否則不相同 encrypt(''原始密碼'')
          select pwdencrypt(''原始密碼'')
          select pwdcompare(''原始密碼'',''加密后密碼'') = 1--相同;否則不相同

          3.取回表中字段:
          declare @list varchar(1000),@sql nvarchar(1000)
          select @list=@list+'',''+b.name from sysobjects a,syscolumns b where a.id=b.id and a.name=''表A''
          set @sql=''select ''+right(@list,len(@list)-1)+'' from 表A''
          exec (@sql)

          4.查看硬盤分區(qū):
          EXEC master..xp_fixeddrives

          5.比較A,B表是否相等:
          if (select checksum_agg(binary_checksum(*)) from A)
          ? =
          ? (select checksum_agg(binary_checksum(*)) from B)
          print ''相等''
          else
          print ''不相等''

          6.殺掉所有的事件探察器進(jìn)程:
          DECLARE hcforeach CURSOR GLOBAL FOR SELECT ''kill ''+RTRIM(spid) FROM master.dbo.sysprocesses
          WHERE program_name IN(''SQL profiler'',N''SQL 事件探查器'')
          EXEC sp_msforeach_worker ''?''

          7.記錄搜索:
          開頭到N條記錄
          Select Top N * From 表
          -------------------------------
          N到M條記錄(要有主索引ID)
          Select Top M-N * From 表 Where ID in (Select Top M ID From 表) Order by ID Desc
          ----------------------------------
          N到結(jié)尾記錄
          Select Top N * From 表 Order by ID Desc

          8.如何修改數(shù)據(jù)庫的名稱:
          sp_renamedb ''old_name'', ''new_name''

          9:獲取當(dāng)前數(shù)據(jù)庫中的所有用戶表
          select Name from sysobjects where xtype=''u'' and status>=0

          10:獲取某一個(gè)表的所有字段
          select name from syscolumns where id=object_id(''表名'')

          11:查看與某一個(gè)表相關(guān)的視圖、存儲(chǔ)過程、函數(shù)
          select a.* from sysobjects a, syscomments b where a.id = b.id and b.text like ''%表名%''

          12:查看當(dāng)前數(shù)據(jù)庫中所有存儲(chǔ)過程
          select name as 存儲(chǔ)過程名稱 from sysobjects where xtype=''P''

          13:查詢用戶創(chuàng)建的所有數(shù)據(jù)庫
          select * from master..sysdatabases D where sid not in(select sid from master..syslogins where name=''sa'')
          或者
          select dbid, name AS DB_NAME from master..sysdatabases where sid <> 0x01

          14:查詢某一個(gè)表的字段和數(shù)據(jù)類型
          select column_name,data_type from information_schema.columns
          where table_name = ''表名''

          [n].[標(biāo)題]:
          Select * From TableName Order By CustomerName

          [n].[標(biāo)題]:
          Select * From TableName Order By CustomerName

          posted @ 2006-04-06 15:01 Ben 閱讀(884) | 評(píng)論 (0)編輯 收藏

          vs2003 和vs2005下的發(fā)送SMTP郵件 (downmoon原創(chuàng)) 選擇自 downmoon 的 Blog

          vs2003 和vs2005下的發(fā)送SMTP郵件 (downmoon原創(chuàng))
          一、vs2003
          引用 System.Web.Mail命名空間

          ?private void SenMail2003()
          ??? {
          ??????? MailMessage mailObj = new MailMessage();
          ??????? mailObj.To = this.txtTo.Text;
          ??????? mailObj.From = this.txtFrom.Text;
          ???????
          ??????? mailObj.Subject = "精采笑話";
          ??????? mailObj.Body = "豬!你已中毒! 哈哈 ";
          ???????
          ??????? mailObj.BodyFormat = MailFormat.Html;
          ??????? mailObj.BodyEncoding = MailFormat.Base64;
          ??????? mailObj.Priority = MailPriority.High;
          ??????? mailObj.Attachments.Add(new MailAttachment("c:\\swf\\000.bmp"));
          ??????? SmtpMail.Send(mailObj);
          ??????? Response.Write("發(fā)送郵件成功!");
          ??? }

          二、vs2005
          引用 System.Net.Mail命名空間,安全性得到了增強(qiáng)

          ?public static void SendWebMailAndAttach(string server)
          ??? {
          ???????? string file = "e:\\inetpub\\wwwroot\\Test2005All\\TestXML\\testXML.xml";
          ???????? System.Net.Mail.MailMessage message = new System.Net.Mail.MailMessage("Test@126.com", "Test@126.com", "text message for you.", "Test Title");
          ???????? System.Net.Mail.Attachment data = new System.Net.Mail.Attachment(file, System.Net.Mime.MediaTypeNames.Application.Octet);
          ???????? System.Net.Mime.ContentDisposition disposition = data.ContentDisposition;
          ???????? disposition.CreationDate = System.IO.File.GetCreationTime(file);
          ???????? disposition.ModificationDate = System.IO.File.GetLastWriteTime(file);
          ???????? disposition.ReadDate = System.IO.File.GetLastAccessTime(file);
          ???????? message.Attachments.Add(data);
          ??????? System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient(server);
          ??????? client.Credentials = new NetworkCredential("用戶名", "密碼");
          ??????? client.Send(message);
          ??????? data.Dispose();
          ??? }
          引用示例
          SendWebMailAndAttach("smtp.126.com");

          posted @ 2006-04-06 14:18 Ben 閱讀(472) | 評(píng)論 (0)編輯 收藏

          SQL中CONVERT轉(zhuǎn)化函數(shù), Concat , COALESCE的用法

          SQL中CONVERT轉(zhuǎn)化函數(shù)的用法

          CONVERT的使用方法:

          ////////////////////////////////////////////////////////////////////////////////////////

          格式:
          CONVERT(data_type,expression[,style])

          說明:
          此樣式一般在時(shí)間類型(datetime,smalldatetime)與字符串類型(nchar,nvarchar,char,varchar)
          相互轉(zhuǎn)換的時(shí)候才用到.

          例子:
          SELECT CONVERT(varchar(30),getdate(),101) now
          結(jié)果為
          now
          ---------------------------------------
          09/15/2001

          /////////////////////////////////////////////////////////////////////////////////////

          style數(shù)字在轉(zhuǎn)換時(shí)間時(shí)的含義如下

          -------------------------------------------------------------------------------------------------
          Style(2位表示年份) | Style(4位表示年份) | 輸入輸出格式
          -------------------------------------------------------------------------------------------------
          - | 0 or 100 | mon dd yyyy hh:miAM(或PM)
          -------------------------------------------------------------------------------------------------
          1 | 101 | mm/dd/yy
          -------------------------------------------------------------------------------------------------
          2 | 102 | yy-mm-dd
          -------------------------------------------------------------------------------------------------
          3 | 103 | dd/mm/yy
          -------------------------------------------------------------------------------------------------
          4 | 104 | dd-mm-yy
          -------------------------------------------------------------------------------------------------
          5 | 105 | dd-mm-yy
          -------------------------------------------------------------------------------------------------
          6 | 106 | dd mon yy
          -------------------------------------------------------------------------------------------------
          7 | 107 | mon dd,yy
          -------------------------------------------------------------------------------------------------
          8 | 108 | hh:mm:ss
          -------------------------------------------------------------------------------------------------
          - | 9 or 109 | mon dd yyyy hh:mi:ss:mmmmAM(或PM)
          -------------------------------------------------------------------------------------------------
          10 | 110 | mm-dd-yy
          -------------------------------------------------------------------------------------------------
          11 | 111 | yy/mm/dd
          -------------------------------------------------------------------------------------------------
          12 | 112 | yymmdd
          -------------------------------------------------------------------------------------------------
          - | 13 or 113 | dd mon yyyy hh:mi:ss:mmm(24小時(shí)制)
          -------------------------------------------------------------------------------------------------
          14 | 114 | hh:mi:ss:mmm(24小時(shí)制)
          -------------------------------------------------------------------------------------------------
          - | 20 or 120 | yyyy-mm-dd hh:mi:ss(24小時(shí)制)
          -------------------------------------------------------------------------------------------------
          - | 21 or 121 | yyyy-mm-dd hh:mi:ss:mmm(24小時(shí)制)
          -------------------------------------------------------------------------------------------------

          concat
          方法的結(jié)果等于:result = string1 + string2 + string3 + … + stringN

          COALESCE 返回其參數(shù)中第一個(gè)非空表達(dá)式

          posted @ 2006-04-06 14:15 Ben 閱讀(1974) | 評(píng)論 (0)編輯 收藏

          [轉(zhuǎn)].NET(C#)連接各類數(shù)據(jù)庫-集錦

          1.C#連接連接Access
          程序代碼:
          -------------------------------------------------------------------------------

          using System.Data;
          using System.Data.OleDb;

          ......

          string strConnection="Provider=Microsoft.Jet.OleDb.4.0;";
          strConnection+=@"Data Source=C:\BegASPNET\Northwind.mdb";

          OleDbConnection objConnection=new OleDbConnection(strConnection);

          ......

          objConnection.Open();
          objConnection.Close();

          ......

          --------------------------------------------------------------------------------

          解釋:

           連接Access數(shù)據(jù)庫需要導(dǎo)入額外的命名空間,所以有了最前面的兩條using命令,這是必不可少的!

           strConnection這個(gè)變量里存放的是連接數(shù)據(jù)庫所需要的連接字符串,他指定了要使用的數(shù)據(jù)提供者和要使用的數(shù)據(jù)源.

           "Provider=Microsoft.Jet.OleDb.4.0;"是指數(shù)據(jù)提供者,這里使用的是Microsoft Jet引擎,也就是Access中的數(shù)據(jù)引擎,asp.net就是靠這個(gè)和Access的數(shù)據(jù)庫連接的.

           "Data Source=C:\BegASPNET\Northwind.mdb"是指明數(shù)據(jù)源的位置,他的標(biāo)準(zhǔn)形式是"Data Source=MyDrive:MyPath\MyFile.MDB".

          PS:
           1."+="后面的"@"符號(hào)是防止將后面字符串中的"\"解析為轉(zhuǎn)義字符.
           2.如果要連接的數(shù)據(jù)庫文件和當(dāng)前文件在同一個(gè)目錄下,還可以使用如下的方法連接:
            strConnection+="Data Source=";
            strConnection+=MapPath("Northwind.mdb");
            這樣就可以省得你寫一大堆東西了!
           3.要注意連接字符串中的參數(shù)之間要用分號(hào)來分隔.

           "OleDbConnection objConnection=new OleDbConnection(strConnection);"這一句是利用定義好的連接字符串來建立了一個(gè)鏈接對(duì)象,以后對(duì)數(shù)據(jù)庫的操作我們都要和這個(gè)對(duì)象打交道.

           "objConnection.Open();"這用來打開連接.至此,與Access數(shù)據(jù)庫的連接完成.
          --------------------------------------------------------------------------------

          2.C#連接SQL Server
          程序代碼:
          --------------------------------------------------------------------------------

          using System.Data;
          using System.Data.SqlClient;

          ...

          string strConnection="user id=sa;password=;";
          strConnection+="initial catalog=Northwind;Server=YourSQLServer;";
          strConnection+="Connect Timeout=30";

          SqlConnection objConnection=new SqlConnection(strConnection);

          ...

          objConnection.Open();
          objConnection.Close();

          ...

          --------------------------------------------------------------------------------

          解釋:

          連接SQL Server數(shù)據(jù)庫的機(jī)制與連接Access的機(jī)制沒有什么太大的區(qū)別,只是改變了Connection對(duì)象和連接字符串中的不同參數(shù).

          首先,連接SQL Server使用的命名空間不是"System.Data.OleDb",而是"System.Data.SqlClient".

          其次就是他的連接字符串了,我們一個(gè)一個(gè)參數(shù)來介紹(注意:參數(shù)間用分號(hào)分隔):
           "user id=sa":連接數(shù)據(jù)庫的驗(yàn)證用戶名為sa.他還有一個(gè)別名"uid",所以這句我們還可以寫成"uid=sa".
           "password=":連接數(shù)據(jù)庫的驗(yàn)證密碼為空.他的別名為"pwd",所以我們可以寫為"pwd=".
           這里注意,你的SQL Server必須已經(jīng)設(shè)置了需要用戶名和密碼來登錄,否則不能用這樣的方式來登錄.如果你的SQL Server設(shè)置為Windows登錄,那么在這里就不需要使用"user id"和"password"這樣的方式來登錄,而需要使用"Trusted_Connection=SSPI"來進(jìn)行登錄.
           "initial catalog=Northwind":使用的數(shù)據(jù)源為"Northwind"這個(gè)數(shù)據(jù)庫.他的別名為"Database",本句可以寫成"Database=Northwind".
           "Server=YourSQLServer":使用名為"YourSQLServer"的服務(wù)器.他的別名為"Data Source","Address","Addr".如果使用的是本地?cái)?shù)據(jù)庫且定義了實(shí)例名,則可以寫為"Server=(local)\實(shí)例名";如果是遠(yuǎn)程服務(wù)器,則將"(local)"替換為遠(yuǎn)程服務(wù)器的名稱或IP地址.
           "Connect Timeout=30":連接超時(shí)時(shí)間為30秒.

           在這里,建立連接對(duì)象用的構(gòu)造函數(shù)為:SqlConnection.
          --------------------------------------------------------------------------------

          3.C#連接Oracle
          程序代碼:
          --------------------------------------------------------------------------------

          using System.Data.OracleClient;
          using System.Data;

          //在窗體上添加一個(gè)按鈕,叫Button1,雙擊Button1,輸入以下代碼
          private void Button1_Click(object sender, System.EventArgs e)
          {
          string ConnectionString="Data Source=sky;user=system;password=manager;";//寫連接串
          OracleConnection conn=new OracleConnection(ConnectionString);//創(chuàng)建一個(gè)新連接
          try
          {
          conn.Open();
          OracleCommand cmd=conn.CreateCommand();

          cmd.CommandText="select * from MyTable";//在這兒寫sql語句
          OracleDataReader odr=cmd.ExecuteReader();//創(chuàng)建一個(gè)OracleDateReader對(duì)象
          while(odr.Read())//讀取數(shù)據(jù),如果odr.Read()返回為false的話,就說明到記錄集的尾部了???????????????
          {
          Response.Write(odr.GetOracleString(1).ToString());//輸出字段1,這個(gè)數(shù)是字段索引,具體怎么使用字段名還有待研究
          }
          odr.Close();
          }
          catch(Exception ee)
          {
          Response.Write(ee.Message); //如果有錯(cuò)誤,輸出錯(cuò)誤信息
          }
          finally
          {
          conn.Close(); //關(guān)閉連接
          }
          }

          --------------------------------------------------------------------------------

          4.C#連接MySQL
          程序代碼:
          --------------------------------------------------------------------------------

          using MySQLDriverCS;

          // 建立數(shù)據(jù)庫連接
          MySQLConnection DBConn;
          DBConn = new MySQLConnection(new MySQLConnectionString("localhost","mysql","root","",3306).AsString);
          DBConn.Open();

          // 執(zhí)行查詢語句
          MySQLCommand DBComm;
          DBComm = new MySQLCommand("select Host,User from user",DBConn);

          // 讀取數(shù)據(jù)
          MySQLDataReader DBReader = DBComm.ExecuteReaderEx();

          // 顯示數(shù)據(jù)
          try
          {
          while (DBReader.Read())
          {
          Console.WriteLine("Host = {0} and User = {1}", DBReader.GetString(0),DBReader.GetString(1));
          }
          }
          finally
          {
          DBReader.Close();
          DBConn.Close();
          }

          //關(guān)閉數(shù)據(jù)庫連接
          DBConn.Close();

          --------------------------------------------------------------------------------

          5.C#連接IBM DB2
          程序代碼:
          --------------------------------------------------------------------------------

          OleDbConnection1.Open();
          //打開數(shù)據(jù)庫連接
          OleDbDataAdapter1.Fill(dataSet1,"Address");
          //將得來的數(shù)據(jù)填入dataSet
          DataGrid1.DataBind();
          //綁定數(shù)據(jù)
          OleDbConnection1.Close();
          //關(guān)閉連接

          //增加數(shù)據(jù)庫數(shù)據(jù)
          在Web Form上新增對(duì)應(yīng)字段數(shù)量個(gè)數(shù)的TextBox,及一個(gè)button,為該按鍵增加Click響應(yīng)事件代碼如下:

          this.OleDbInsertCommand1.CommandText = "INSERTsintosADDRESS(NAME,
          EMAIL, AGE, ADDRESS) VALUES
          ('"+TextBox1.Text+"','"+TextBox2.Text+"','"+TextBox3.Text+"','"+TextBox4.Text+"')";
          OleDbInsertCommand1.Connection.Open();
          //打開連接
          OleDbInsertCommand1.ExecuteNonQuery();
          //執(zhí)行該SQL語句
          OleDbInsertCommand1.Connection.Close();
          //關(guān)閉連接

          --------------------------------------------------------------------------------

          6.C#連接SyBase
          程序代碼: (OleDb)
          --------------------------------------------------------------------------------

          Provider=Sybase.ASEOLEDBProvider.2;Initial Catalog=數(shù)據(jù)庫名;User ID=用戶名;Data Source=數(shù)據(jù)源;Extended Properties="";Server Name=ip地址;Network Protocol=Winsock;Server Port Address=5000;

          posted @ 2006-04-05 14:07 Ben 閱讀(317) | 評(píng)論 (0)編輯 收藏

          [轉(zhuǎn)帖]SQL Server - [分布式查詢/事務(wù)]

          分布式查詢
          ??? OPENROWSET
          ??? 從Excel取數(shù)據(jù)
          ??? SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0','Excel 8.0;Database=d:\1.xls',[Sheet1$])
          ??? 從Oracle取數(shù)據(jù)
          ??? SELECT?* FROM OPENROWSET('MSDAORA.1','NetServiceName';'User';'Password','SELECT * FROM OracleTalbe')
          ?
          ??? Linked Server(for Oracle)
          ??? 建立Linked Server
          ??? sp_addlinkedserver'Allies', 'Oracle', 'MSDAORA.1', 'NetServiceName'
          ??? Oracle的Login
          ??? sp_addlinkedsrvlogin'Allies', FALSE, 'SQLServerLogin', 'OracleUser', 'OraclePassword'
          ??? 從Oracle查詢數(shù)據(jù)
          ??? SELECT*FROM OPENQUERY( Allies, 'SELECT * FROM OracleTalbe'),或者
          ??? SELECT*FROM Allies..OracleUser.OracleTalbe
          ??? 修改Linked Server的Server Option
          ? ?? sp_serveroption'Allies', 'Option Name', 'Option Value'
          ??? 例如
          ??? sp_serveroption'OraDC', 'rpc out', 'true'
          ??? sp_serveroption'OraDC', 'rpc', 'true'
          ??? 向Oracle插入數(shù)據(jù)(還沒有用過)
          ??? INSERT INTO OPENQUERY(Allies, 'SELECT ... FROM OracleTalbe WHERE 1=2') VALUES ( ... )
          ??? 刪除Linked Server
          ??? sp_dropserver'Allies', 'droplogins'
          ?
          ??? 注意:使用OPENROWSET、OPENQUERY時(shí),SQL Server不對(duì)提交的SQL語句做任何檢查,直接將語句提交給Linked Server進(jìn)行處理;使用四部分命名法時(shí),SQL Server可能從Linked Server上讀取被引用表的數(shù)據(jù)到SQL Server,然后在SQL Server上來完成其它操作。
          ?
          ??? 設(shè)置SQL Server到Oracle的Linked Server,可參考以下KB文章:
          ??? How to set up and troubleshoot a linked server to Oracle in SQL Server
          ??? Limitations of Microsoft Oracle ODBC Driver and OLEDB Provider
          ??? Techniques to Debug Connectivity Issues to an Oracle Server Using the ODBC Driver and OLE DB Provider
          ??? Supportability of the Microsoft ODBC Driver/ OLE DB Provider for Oracle w.r.t Oracle 8.x
          ?
          ??? 分布式事務(wù)中的OPENROWSET、OPENQUERY、OPENDATASOURCE
          ??? 如果在事務(wù),或是一些隱含使用事務(wù)的情況下,例如TRIGGER中,使用OPENROWSET、OPENQUERY、OPENDATASOURCE時(shí),就需要使用分布式事務(wù)來處理。
          ??? 在分布式事務(wù)中使用OPENROWSET、OPENQUERY、OPENDATASOURCE或Linked Server時(shí),需要注意:
          ??? 1. 必須啟動(dòng)MSDTC服務(wù)。
          ????Service Name為Distributed Transaction Coodinator。
          ??? 2. 所涉及的Server之間如果存在網(wǎng)關(guān)、防火墻,需要開啟TCP 135端口。
          ??? 分布式事務(wù)需要使用這個(gè)端口通訊。
          ??? 3. 如果Server之間跨網(wǎng)段,則Server之間需要能互相PING到機(jī)器名(而不是IP地址)。
          ??? 如果相互PING機(jī)器名有問題,修改system32/driver/etc目錄下的hosts文件。
          ?
          ??? 上面的設(shè)置不正確時(shí),會(huì)出現(xiàn)類似如下的錯(cuò)誤:
          ??? 該操作未能執(zhí)行,因?yàn)?OLE DB 提供程序 'SQLOLEDB' 無法啟動(dòng)分布式事務(wù)。
          [OLE/DB provider returned message: 新事務(wù)不能登記到指定的事務(wù)處理器中。 ]
          OLE DB 錯(cuò)誤跟蹤[OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned 0x8004d00a]。
          ?
          ?
          ??? 分布式事務(wù)可以查詢下列KB文章:
          ??? Failed to Enlist on Calling Object's Transaction
          ??? How to troubleshoot MS DTC firewall issues
          ??? You receive error 7391 when you run a distributed transaction against a linked server
          ?
          ??? 使用分布式查詢,可以參考:Chapter 25 - Distributed Queries: OLE DB Connectivity
          ??? 關(guān)于ORAOLEDB提供程序的詳細(xì)說明,可以參考:Oracle Provider for OLE DB Developer's Guide - Release 9.2

          posted @ 2006-03-29 16:35 Ben 閱讀(1209) | 評(píng)論 (0)編輯 收藏

          [轉(zhuǎn)]揭開正則表達(dá)式的神秘面紗

          [原創(chuàng)文章,轉(zhuǎn)載請(qǐng)保留或注明出處:http://www.regexlab.com/zh/regref.htm]

          引言

              正則表達(dá)式(regular expression)描述了一種字符串匹配的模式,可以用來:(1)檢查一個(gè)串中是否含有符合某個(gè)規(guī)則的子串,并且可以得到這個(gè)子串;(2)根據(jù)匹配規(guī)則對(duì)字符串進(jìn)行靈活的替換操作。

              正則表達(dá)式學(xué)習(xí)起來其實(shí)是很簡單的,不多的幾個(gè)較為抽象的概念也很容易理解。之所以很多人感覺正則表達(dá)式比較復(fù)雜,一方面是因?yàn)榇蠖鄶?shù)的文檔沒有做到由淺入深地講解,概念上沒有注意先后順序,給讀者的理解帶來困難;另一方面,各種引擎自帶的文檔一般都要介紹它特有的功能,然而這部分特有的功能并不是我們首先要理解的。

              文章中的每一個(gè)舉例,都可以點(diǎn)擊進(jìn)入到測試頁面進(jìn)行測試。閑話少說,開始。


          1. 正則表達(dá)式規(guī)則

          1.1 普通字符

              字母、數(shù)字、漢字、下劃線、以及后邊章節(jié)中沒有特殊定義的標(biāo)點(diǎn)符號(hào),都是"普通字符"。表達(dá)式中的普通字符,在匹配一個(gè)字符串的時(shí)候,匹配與之相同的一個(gè)字符。

              ,匹配結(jié)果是:成功;匹配到的內(nèi)容是:"c";匹配到的位置是:開始于2,結(jié)束于3。(注:下標(biāo)從0開始還是從1開始,因當(dāng)前編程語言的不同而可能不同)

             
          ,匹配結(jié)果是:成功;匹配到的內(nèi)容是:"bcd";匹配到的位置是:開始于1,結(jié)束于4。


          1.2 簡單的轉(zhuǎn)義字符

              一些不便書寫的字符,采用在前面加 "\" 的方法。這些字符其實(shí)我們都已經(jīng)熟知了。

          表達(dá)式

          可匹配

          \r, \n

          代表回車和換行符

          \t

          制表符

          \\

          代表 "\" 本身

              還有其他一些在后邊章節(jié)中有特殊用處的標(biāo)點(diǎn)符號(hào),在前面加 "\" 后,就代表該符號(hào)本身。比如:^, $ 都有特殊意義,如果要想匹配字符串中 "^" 和 "$" 字符,則表達(dá)式就需要寫成 "\^" 和 "\$"。

          表達(dá)式

          可匹配

          \^

          匹配 ^ 符號(hào)本身

          \$

          匹配 $ 符號(hào)本身

          \.

          匹配小數(shù)點(diǎn)(.)本身

              這些轉(zhuǎn)義字符的匹配方法與 "普通字符" 是類似的。也是匹配與之相同的一個(gè)字符。

             
          ,匹配結(jié)果是:成功;匹配到的內(nèi)容是:"$d";匹配到的位置是:開始于3,結(jié)束于5。


          1.3 能夠與 '多種字符' 匹配的表達(dá)式

              正則表達(dá)式中的一些表示方法,可以匹配 '多種字符' 其中的任意一個(gè)字符。比如,表達(dá)式 "\d" 可以匹配任意一個(gè)數(shù)字。雖然可以匹配其中任意字符,但是只能是一個(gè),不是多個(gè)。這就好比玩撲克牌時(shí)候,大小王可以代替任意一張牌,但是只能代替一張牌。

          表達(dá)式

          可匹配

          \d

          任意一個(gè)數(shù)字,0~9 中的任意一個(gè)

          \w

          任意一個(gè)字母或數(shù)字或下劃線,也就是 A~Z,a~z,0~9,_ 中任意一個(gè)

          \s

          包括空格、制表符、換頁符等空白字符的其中任意一個(gè)

          .

          小數(shù)點(diǎn)可以匹配除了換行符(\n)以外的任意一個(gè)字符

              ,匹配的結(jié)果是:成功;匹配到的內(nèi)容是:"12";匹配到的位置是:開始于3,結(jié)束于5。

             
          ,匹配的結(jié)果是:成功;匹配到的內(nèi)容是:"aa1";匹配到的位置是:開始于1,結(jié)束于4。


          1.4 自定義能夠匹配 '多種字符' 的表達(dá)式

              使用方括號(hào) [ ] 包含一系列字符,能夠匹配其中任意一個(gè)字符。用 [^ ] 包含一系列字符,則能夠匹配其中字符之外的任意一個(gè)字符。同樣的道理,雖然可以匹配其中任意一個(gè),但是只能是一個(gè),不是多個(gè)。

          表達(dá)式

          可匹配

          [ab5@]

          匹配 "a" 或 "b" 或 "5" 或 "@"

          [^abc]

          匹配 "a","b","c" 之外的任意一個(gè)字符

          [f-k]

          匹配 "f"~"k" 之間的任意一個(gè)字母

          [^A-F0-3]

          匹配 "A"~"F","0"~"3" 之外的任意一個(gè)字符

              ,匹配的結(jié)果是:成功;匹配到的內(nèi)容是:"bc";匹配到的位置是:開始于1,結(jié)束于3。

             
          ,匹配的結(jié)果是:成功;匹配到的內(nèi)容是:"1";匹配到的位置是:開始于3,結(jié)束于4。


          1.5 修飾匹配次數(shù)的特殊符號(hào)

              前面章節(jié)中講到的表達(dá)式,無論是只能匹配一種字符的表達(dá)式,還是可以匹配多種字符其中任意一個(gè)的表達(dá)式,都只能匹配一次。如果使用表達(dá)式再加上修飾匹配次數(shù)的特殊符號(hào),那么不用重復(fù)書寫表達(dá)式就可以重復(fù)匹配。

              使用方法是:"次數(shù)修飾"放在"被修飾的表達(dá)式"后邊。比如:"[bcd][bcd]" 可以寫成 "[bcd]{2}"。

          表達(dá)式

          作用

          {n}

          表達(dá)式重復(fù)n次,比如:

          {m,n}

          表達(dá)式至少重復(fù)m次,最多重復(fù)n次,比如:

          {m,}

          表達(dá)式至少重復(fù)m次,比如:

          ?

          匹配表達(dá)式0次或者1次,相當(dāng)于 {0,1},比如:

          +

          表達(dá)式至少出現(xiàn)1次,相當(dāng)于 {1,},比如:

          *

          表達(dá)式不出現(xiàn)或出現(xiàn)任意次,相當(dāng)于 {0,},比如:

              ,匹配的結(jié)果是:成功;匹配到的內(nèi)容是:"12.5";匹配到的位置是:開始于10,結(jié)束于14。

             
          ,匹配的結(jié)果是:成功;匹配到的內(nèi)容是:"goooooogle";匹配到的位置是:開始于7,結(jié)束于17。


          1.6 其他一些代表抽象意義的特殊符號(hào)

              一些符號(hào)在表達(dá)式中代表抽象的特殊意義:

          表達(dá)式

          作用

          ^

          與字符串開始的地方匹配,不匹配任何字符

          $

          與字符串結(jié)束的地方匹配,不匹配任何字符

          \b

          匹配一個(gè)單詞邊界,也就是單詞和空格之間的位置,不匹配任何字符

              進(jìn)一步的文字說明仍然比較抽象,因此,舉例幫助大家理解。

             
          ,匹配結(jié)果是:失敗。因?yàn)?"^" 要求與字符串開始的地方匹配,因此,只有當(dāng) "aaa" 位于字符串的開頭的時(shí)候,"^aaa" 才能匹配,

             
          ,匹配結(jié)果是:失敗。因?yàn)?"$" 要求與字符串結(jié)束的地方匹配,因此,只有當(dāng) "aaa" 位于字符串的結(jié)尾的時(shí)候,"aaa$" 才能匹配,

             
          ,匹配結(jié)果是:成功;匹配到的內(nèi)容是:"@a";匹配到的位置是:開始于2,結(jié)束于4。
              進(jìn)一步說明:"\b" 與 "^" 和 "$" 類似,本身不匹配任何字符,但是它要求它在匹配結(jié)果中所處位置的左右兩邊,其中一邊是 "\w" 范圍,另一邊是 非"\w" 的范圍。

             
          ,匹配結(jié)果是:成功;匹配到的內(nèi)容是:"end";匹配到的位置是:開始于15,結(jié)束于18。

              一些符號(hào)可以影響表達(dá)式內(nèi)部的子表達(dá)式之間的關(guān)系:

          表達(dá)式

          作用

          |

          左右兩邊表達(dá)式之間 "或" 關(guān)系,匹配左邊或者右邊

          ( )

          (1). 在被修飾匹配次數(shù)的時(shí)候,括號(hào)中的表達(dá)式可以作為整體被修飾
          (2). 取匹配結(jié)果的時(shí)候,括號(hào)中的表達(dá)式匹配到的內(nèi)容可以被單獨(dú)得到

              ,匹配結(jié)果是:成功;匹配到的內(nèi)容是:"Tom";匹配到的位置是:開始于4,結(jié)束于7。匹配下一個(gè)時(shí),匹配結(jié)果是:成功;匹配到的內(nèi)容是:"Jack";匹配到的位置時(shí):開始于15,結(jié)束于19。

             
          ,匹配結(jié)果是:成功;匹配到內(nèi)容是:"go go go";匹配到的位置是:開始于6,結(jié)束于14。

             
          ,匹配的結(jié)果是:成功;匹配到的內(nèi)容是:"¥20.5";匹配到的位置是:開始于6,結(jié)束于10。單獨(dú)獲取括號(hào)范圍匹配到的內(nèi)容是:"20.5"。


          2. 正則表達(dá)式中的一些高級(jí)規(guī)則

          2.1 匹配次數(shù)中的貪婪與非貪婪

              在使用修飾匹配次數(shù)的特殊符號(hào)時(shí),有幾種表示方法可以使同一個(gè)表達(dá)式能夠匹配不同的次數(shù),比如:"{m,n}", "{m,}", "?", "*", "+",具體匹配的次數(shù)隨被匹配的字符串而定。這種重復(fù)匹配不定次數(shù)的表達(dá)式在匹配過程中,總是盡可能多的匹配。比如,針對(duì)文本 "dxxxdxxxd",舉例如下:

          表達(dá)式

          匹配結(jié)果

          (d)(\w+)

          "\w+" 將匹配第一個(gè) "d" 之后的所有字符 "xxxdxxxd"

          (d)(\w+)(d)

          "\w+" 將匹配第一個(gè) "d" 和最后一個(gè) "d" 之間的所有字符 "xxxdxxx"。雖然 "\w+" 也能夠匹配上最后一個(gè) "d",但是為了使整個(gè)表達(dá)式匹配成功,"\w+" 可以 "讓出" 它本來能夠匹配的最后一個(gè) "d"

              由此可見,"\w+" 在匹配的時(shí)候,總是盡可能多的匹配符合它規(guī)則的字符。雖然第二個(gè)舉例中,它沒有匹配最后一個(gè) "d",但那也是為了讓整個(gè)表達(dá)式能夠匹配成功。同理,帶 "*" 和 "{m,n}" 的表達(dá)式都是盡可能地多匹配,帶 "?" 的表達(dá)式在可匹配可不匹配的時(shí)候,也是盡可能的 "要匹配"。這 種匹配原則就叫作 "貪婪" 模式 。

              非貪婪模式:

              在修飾匹配次數(shù)的特殊符號(hào)后再加上一個(gè) "?" 號(hào),則可以使匹配次數(shù)不定的表達(dá)式盡可能少的匹配,使可匹配可不匹配的表達(dá)式,盡可能的 "不匹配"。這種匹配原則叫作 "非貪婪" 模式,也叫作 "勉強(qiáng)" 模式。如果少匹配就會(huì)導(dǎo)致整個(gè)表達(dá)式匹配失敗的時(shí)候,與貪婪模式類似,非貪婪模式會(huì)最小限度的再匹配一些,以使整個(gè)表達(dá)式匹配成功。舉例如下,針對(duì)文本 "dxxxdxxxd" 舉例:

          表達(dá)式

          匹配結(jié)果

          (d)(\w+?)

          "\w+?" 將盡可能少的匹配第一個(gè) "d" 之后的字符,結(jié)果是:"\w+?" 只匹配了一個(gè) "x"

          (d)(\w+?)(d)

          為了讓整個(gè)表達(dá)式匹配成功,"\w+?" 不得不匹配 "xxx" 才可以讓后邊的 "d" 匹配,從而使整個(gè)表達(dá)式匹配成功。因此,結(jié)果是:"\w+?" 匹配 "xxx"

              更多的情況,舉例如下:

             
          ,匹配的結(jié)果是:成功;匹配到的內(nèi)容是 "<td><p>aa</p></td> <td><p>bb</p></td>" 整個(gè)字符串, 表達(dá)式中的 "</td>" 將與字符串中最后一個(gè) "</td>" 匹配。

             
          ,將只得到 "<td><p>aa</p></td>", 再次匹配下一個(gè)時(shí),可以得到第二個(gè) "<td><p>bb</p></td>"。


          2.2 反向引用 \1, \2...

              表達(dá)式在匹配時(shí),表達(dá)式引擎會(huì)將小括號(hào) "( )" 包含的表達(dá)式所匹配到的字符串記錄下來。在獲取匹配結(jié)果的時(shí)候,小括號(hào)包含的表達(dá)式所匹配到的字符串可以單獨(dú)獲取。這一點(diǎn),在前面的舉例中,已經(jīng)多次展示了。在實(shí)際應(yīng)用場合中,當(dāng)用某種邊界來查找,而所要獲取的內(nèi)容又不包含邊界時(shí),必須使用小括號(hào)來指定所要的范圍。比如前面的 "<td>(.*?)</td>"。

              其實(shí),"小括號(hào)包含的表達(dá)式所匹配到的字符串" 不僅是在匹配結(jié)束后才可以使用,在匹配過程中也可以使用。表達(dá)式后邊的部分,可以引用前面 "括號(hào)內(nèi)的子匹配已經(jīng)匹配到的字符串"。引用方法是 "\" 加上一個(gè)數(shù)字。"\1" 引用第1對(duì)括號(hào)內(nèi)匹配到的字符串,"\2" 引用第2對(duì)括號(hào)內(nèi)匹配到的字符串……以此類推,如果一對(duì)括號(hào)內(nèi)包含另一對(duì)括號(hào),則外層的括號(hào)先排序號(hào)。換句話說,哪一對(duì)的左括號(hào) "(" 在前,那這一對(duì)就先排序號(hào)。

              舉例如下:

             
          ,匹配結(jié)果是:成功;匹配到的內(nèi)容是:" 'Hello' "。再次匹配下一個(gè)時(shí),可以匹配到 " "World" "。

             
          ,匹配結(jié)果是:成功;匹配到的內(nèi)容是 "ccccc"。再次匹配下一個(gè)時(shí),將得到 999999999。這個(gè)表達(dá)式要求 "\w" 范圍的字符至少重復(fù)5次,

             
          ,匹配結(jié)果是成功。如果 "<td>" 與 "</td>" 不配對(duì),則會(huì)匹配失敗;如果改成其他配對(duì),也可以匹配成功。


          2.3 預(yù)搜索,不匹配;反向預(yù)搜索,不匹配

              前面的章節(jié)中,我講到了幾個(gè)代表抽象意義的特殊符號(hào):"^","$","\b"。它們都有一個(gè)共同點(diǎn),那就是:它們本身不匹配任何字符,只是對(duì) "字符串的兩頭" 或者 "字符之間的縫隙" 附加了一個(gè)條件。理解到這個(gè)概念以后,本節(jié)將繼續(xù)介紹另外一種對(duì) "兩頭" 或者 "縫隙" 附加條件的,更加靈活的表示方法。

              正向預(yù)搜索:"(?=xxxxx)","(?!xxxxx)"

              格式:"(?=xxxxx)",在被匹配的字符串中,它對(duì)所處的 "縫隙" 或者 "兩頭" 附加的條件是:所在縫隙的右側(cè),必須能夠匹配上 xxxxx 這部分的表達(dá)式。因?yàn)樗皇窃诖俗鳛檫@個(gè)縫隙上附加的條件,所以它并不影響后邊的表達(dá)式去真正匹配這個(gè)縫隙之后的字符。這就類似 "\b",本身不匹配任何字符。"\b" 只是將所在縫隙之前、之后的字符取來進(jìn)行了一下判斷,不會(huì)影響后邊的表達(dá)式來真正的匹配。

             
          ,將只匹配 "Windows NT" 中的 "Windows ",其他的 "Windows " 字樣則不被匹配。

             
          ,將可以匹配6個(gè)"f"的前4個(gè),可以匹配9個(gè)"9"的前7個(gè)。這個(gè)表達(dá)式可以讀解成:重復(fù)4次以上的字母數(shù)字,則匹配其剩下最后2位之前的部分。當(dāng)然,這個(gè)表達(dá)式可以不這樣寫,在此的目的是作為演示之用。

              格式:"(?!xxxxx)",所在縫隙的右側(cè),必須不能匹配 xxxxx 這部分表達(dá)式。

             
          ,將從頭一直匹配到 "stop" 之前的位置,如果字符串中沒有 "stop",則匹配整個(gè)字符串。

             
          ,只能匹配 "do"。在本條舉例中,"do" 后邊使用 "(?!\w)" 和使用 "\b" 效果是一樣的。

              反向預(yù)搜索:"(?<=xxxxx)","(?<!xxxxx)"

              這兩種格式的概念和正向預(yù)搜索是類似的,反向預(yù)搜索要求的條件是:所在縫隙的 "左側(cè)",兩種格式分別要求必須能夠匹配和必須不能夠匹配指定表達(dá)式,而不是去判斷右側(cè)。與 "正向預(yù)搜索" 一樣的是:它們都是對(duì)所在縫隙的一種附加條件,本身都不匹配任何字符。

              舉例5:表達(dá)式 "(?<=\d{4})\d+(?=\d{4})" 在匹配 "1234567890123456" 時(shí),將匹配除了前4個(gè)數(shù)字和后4個(gè)數(shù)字之外的中間8個(gè)數(shù)字。由于 JScript.RegExp 不支持反向預(yù)搜索,因此,本條舉例不能夠進(jìn)行演示。很多其他的引擎可以支持反向預(yù)搜索,比如:Java 1.4 以上的 java.util.regex 包,.NET 中System.Text.RegularExpressions 命名空間,boost::regex 以及
          GRETA 正則表達(dá)式庫等。


          3. 其他通用規(guī)則

              還有一些在各個(gè)正則表達(dá)式引擎之間比較通用的規(guī)則,在前面的講解過程中沒有提到。

          3.1 表達(dá)式中,可以使用 "\xXX" 和 "\uXXXX" 表示一個(gè)字符("X" 表示一個(gè)十六進(jìn)制數(shù))

          形式

          字符范圍

          \xXX

          編號(hào)在 0 ~ 255 范圍的字符,比如:

          \uXXXX

          任何字符可以使用 "\u" 再加上其編號(hào)的4位十六進(jìn)制數(shù)表示,比如:

          3.2 在表達(dá)式 "\s","\d","\w","\b" 表示特殊意義的同時(shí),對(duì)應(yīng)的大寫字母表示相反的意義

          表達(dá)式

          可匹配

          \S

          \D

          匹配所有的非數(shù)字字符

          \W

          匹配所有的字母、數(shù)字、下劃線以外的字符

          \B

          3.3 在表達(dá)式中有特殊意義,需要添加 "\" 才能匹配該字符本身的字符匯總

          字符

          說明

          ^

          匹配輸入字符串的開始位置。要匹配 "^" 字符本身,請(qǐng)使用 "\^"

          $

          匹配輸入字符串的結(jié)尾位置。要匹配 "$" 字符本身,請(qǐng)使用 "\$"

          ( )

          標(biāo)記一個(gè)子表達(dá)式的開始和結(jié)束位置。要匹配小括號(hào),請(qǐng)使用 "\(" 和 "\)"

          [ ]

          用來自定義能夠匹配 '多種字符' 的表達(dá)式。要匹配中括號(hào),請(qǐng)使用 "\[" 和 "\]"

          { }

          修飾匹配次數(shù)的符號(hào)。要匹配大括號(hào),請(qǐng)使用 "\{" 和 "\}"

          .

          匹配除了換行符(\n)以外的任意一個(gè)字符。要匹配小數(shù)點(diǎn)本身,請(qǐng)使用 "\."

          ?

          修飾匹配次數(shù)為 0 次或 1 次。要匹配 "?" 字符本身,請(qǐng)使用 "\?"

          +

          修飾匹配次數(shù)為至少 1 次。要匹配 "+" 字符本身,請(qǐng)使用 "\+"

          *

          修飾匹配次數(shù)為 0 次或任意次。要匹配 "*" 字符本身,請(qǐng)使用 "\*"

          |

          左右兩邊表達(dá)式之間 "或" 關(guān)系。匹配 "|" 本身,請(qǐng)使用 "\|"

          3.4 括號(hào) "( )" 內(nèi)的子表達(dá)式,如果希望匹配結(jié)果不進(jìn)行記錄供以后使用,可以使用 "(?:xxxxx)" 格式

              舉例1:表達(dá)式 "(?:(\w)\1)+" 匹配 "a bbccdd efg" 時(shí),結(jié)果是 "bbccdd"。括號(hào) "(?:)" 范圍的匹配結(jié)果不進(jìn)行記錄,因此 "(\w)" 使用 "\1" 來引用。

          3.5 常用的表達(dá)式屬性設(shè)置簡介:Ignorecase,Singleline,Multiline,Global

          表達(dá)式屬性

          說明

          Ignorecase

          默認(rèn)情況下,表達(dá)式中的字母是要區(qū)分大小寫的。配置為 Ignorecase 可使匹配時(shí)不區(qū)分大小寫。有的表達(dá)式引擎,把 "大小寫" 概念延伸至 UNICODE 范圍的大小寫。

          Singleline

          默認(rèn)情況下,小數(shù)點(diǎn) "." 匹配除了換行符(\n)以外的字符。配置為 Singleline 可使小數(shù)點(diǎn)可匹配包括換行符在內(nèi)的所有字符。

          Multiline

          默認(rèn)情況下,表達(dá)式 "^" 和 "$" 只匹配字符串的開始 ① 和結(jié)尾 ④ 位置。如:

          ①xxxxxxxxx②\n
          ③xxxxxxxxx④

          配置為 Multiline 可以使 "^" 還可以匹配換行符之后,下一行開始前 ③ 的位置,使 "$" 還可以匹配換行符之前,一行結(jié)束 ② 的位置。

          Global

          主要在將表達(dá)式用來替換時(shí)起作用,配置為 Global 表示替換所有的匹配。


          4. 綜合提示

          4.1 如果要要求表達(dá)式所匹配的內(nèi)容是整個(gè)字符串,而不是從字符串中找一部分,那么可以在表達(dá)式的首尾使用 "^" 和 "$",比如:"^\d+$" 要求整個(gè)字符串只有數(shù)字。

          4.2 如果要求匹配的內(nèi)容是一個(gè)完整的單詞,而不會(huì)是單詞的一部分,那么在表達(dá)式首尾使用 "\b",比如:

          4.3 表達(dá)式不要匹配空字符串。否則會(huì)一直得到匹配成功,而結(jié)果什么都沒有匹配到。比如:準(zhǔn)備寫一個(gè)匹配 "123"、"123."、"123.5"、".5" 這幾種形式的表達(dá)式時(shí),整數(shù)、小數(shù)點(diǎn)、小數(shù)數(shù)字都可以省略,但是不要將表達(dá)式寫成:"\d*\.?\d*",因?yàn)槿绻裁炊紱]有,這個(gè)表達(dá)式也可以匹配成功。

          4.4 能匹配空字符串的子匹配不要循環(huán)無限次。如果括號(hào)內(nèi)的子表達(dá)式中的每一部分都可以匹配 0 次,而這個(gè)括號(hào)整體又可以匹配無限次,那么情況可能比上一條所說的更嚴(yán)重,匹配過程中可能死循環(huán)。雖然現(xiàn)在有些正則表達(dá)式引擎已經(jīng)通過辦法避免了這種情況出現(xiàn)死循環(huán)了,比如 .NET 的正則表達(dá)式,但是我們?nèi)匀粦?yīng)該盡量避免出現(xiàn)這種情況。如果我們?cè)趯懕磉_(dá)式時(shí)遇到了死循環(huán),也可以從這一點(diǎn)入手,查找一下是否是本條所說的原因。

          4.5 合理選擇貪婪模式與非貪婪模式。

          4.6 或 "|" 的左右兩邊,對(duì)某個(gè)字符最好只有一邊可以匹配,這樣,不會(huì)因?yàn)?"|" 兩邊的表達(dá)式因?yàn)榻粨Q位置而有所不同。


          5. 搜索更多正則表達(dá)式支持

          在以下搜索字段中輸入關(guān)鍵字,查找問題的答案。

          posted @ 2006-02-22 10:47 Ben 閱讀(421) | 評(píng)論 (0)編輯 收藏

          了解DLL

          一、從DLL技術(shù)說起

          要了解DLL木馬,就必須知道這個(gè)“DLL”是什么意思,所以,讓我們追溯到幾年前,DOS系統(tǒng)大行其道的日子里。在那時(shí)候,寫程序是一件繁瑣的事情,因?yàn)槊總€(gè)程序的代碼都是獨(dú)立的,有時(shí)候?yàn)榱藢?shí)現(xiàn)一個(gè)功能,就要為此寫很多代碼,后來隨著編程技術(shù)發(fā)展,程序員們把很多常用的代碼集合(通用代碼)放進(jìn)一個(gè)獨(dú)立的文件里,并把這個(gè)文件稱為Library),在寫程序的時(shí)候,把這個(gè)庫文件加入編譯器,就能使用這個(gè)庫包含的所有功能而不必自己再去寫一大堆代碼,這個(gè)技術(shù)被稱為靜態(tài)鏈接Static Link)。靜態(tài)鏈接技術(shù)讓勞累的程序員松了口氣,一切似乎都很美好。可是事實(shí)證明,美好的事物不會(huì)存在太久,因?yàn)殪o態(tài)鏈接就像一個(gè)粗魯?shù)耐其N員,不管你想不想要宣傳單,他都全部塞到你的手上來。寫一個(gè)程序只想用到一個(gè)庫文件包含的某個(gè)圖形效果,就因?yàn)檫@個(gè),你不得不把這個(gè)庫文件攜帶的所有的圖形效果都加入程序,留著它們當(dāng)花瓶擺設(shè),這倒沒什么重要,可是這些花瓶卻把道路都阻塞了——靜態(tài)鏈接技術(shù)讓最終的程序成了大塊頭,因?yàn)?/SPAN>編譯器把整個(gè)庫文件也算進(jìn)去了。

          時(shí)代在發(fā)展,靜態(tài)鏈接技術(shù)由于天生的弊端,不能滿足程序員的愿望,人們開始尋找一種更好的方法來解決代碼重復(fù)的難題。后來,Windows系統(tǒng)出現(xiàn)了,時(shí)代的分水嶺終于出現(xiàn)。Windows系統(tǒng)使用一種新的鏈接技術(shù),這種被稱為動(dòng)態(tài)鏈接Dynamic Link)的新技術(shù)同樣也是使用庫文件,微軟稱它們?yōu)?/SPAN>動(dòng)態(tài)鏈接庫”——Dynamic Link LibraryDLL的名字就是這樣來的。動(dòng)態(tài)鏈接本身和靜態(tài)鏈接沒什么區(qū)別,也是把通用代碼寫進(jìn)一些獨(dú)立文件里,但是在編譯方面,微軟繞了個(gè)圈子,并沒有采取把庫文件加進(jìn)程序的方法,而是把庫文件做成已經(jīng)編譯好的程序文件,給它們開個(gè)交換數(shù)據(jù)的接口,程序員寫程序的時(shí)候,一旦要使用某個(gè)庫文件的一個(gè)功能函數(shù),系統(tǒng)就把這個(gè)庫文件調(diào)入內(nèi)存,連接上這個(gè)程序占有的任務(wù)進(jìn)程,然后執(zhí)行程序要用的功能函數(shù),并把結(jié)果返回給程序顯示出來,在我們看來,就像是程序自己帶有的功能一樣。完成需要的功能后,這個(gè)DLL停止運(yùn)行,整個(gè)調(diào)用過程結(jié)束。微軟讓這些庫文件能被多個(gè)程序調(diào)用,實(shí)現(xiàn)了比較完美的共享,程序員無論要寫什么程序,只要在代碼里加入對(duì)相關(guān)DLL的調(diào)用聲明就能使用它的全部功能。最重要的是,DLL絕對(duì)不會(huì)讓你多拿一個(gè)花瓶,你要什么它就給你什么,你不要的東西它才不會(huì)給你。這樣,寫出來的程序就不能再攜帶一大堆垃圾了——絕對(duì)不會(huì)讓你把吃剩的東西帶回家,否則罰款,這是自助餐。

          DLL
          技術(shù)的誕生,使編寫程序變成一件簡單的事情,Windows為我們提供了幾千個(gè)函數(shù)接口,足以滿足大多數(shù)程序員的需要。而且,Windows系統(tǒng)自身就是由幾千個(gè)DLL文件組成,這些DLL相互扶持,組成了強(qiáng)大的Windows系統(tǒng)。如果Windows使用靜態(tài)鏈接技術(shù),它的體積會(huì)有多大?我不敢想。

          二、應(yīng)用程序接口API

          上面我們對(duì)DLL技術(shù)做了個(gè)大概分析,在里面我提到了接口,這又是什么呢?因?yàn)?/SPAN>DLL不能像靜態(tài)庫文件那樣塞進(jìn)程序里,所以,如何讓程序知道實(shí)現(xiàn)功能的代碼和文件成了問題,微軟就為DLL技術(shù)做了標(biāo)準(zhǔn)規(guī)范,讓一個(gè)DLL文件像奶酪一樣開了許多小洞,每個(gè)洞口都注明里面存放的功能的名字,程序只要根據(jù)標(biāo)準(zhǔn)規(guī)范找到相關(guān)洞口就可以取得它要的美味了,這個(gè)洞口就是應(yīng)用程序接口Application Programming Interface),每個(gè)DLL帶的接口都不相同,盡最大可能的減少了代碼的重復(fù)。用Steven的一句話:API就是一個(gè)工具箱,你根據(jù)需要取出螺絲刀、扳手,用完后再把它們放回原處。在Windows里,最基本的3個(gè)DLL文件是kernel32.dlluser32.dllgdi32.dll。它們共同構(gòu)成了基本的系統(tǒng)框架。

          posted @ 2006-02-17 11:25 Ben 閱讀(264) | 評(píng)論 (0)編輯 收藏

          Google的技巧(特輯)

          1:網(wǎng)絡(luò)攝像頭

          在Google中輸入“inurl:"ViewerFrame?Mode="”或者“inurl:"MultiCameraFrame?Mode="”、“inurl:"view/index.shtml"”(輸入時(shí)不帶外面的雙引號(hào),在英文狀態(tài)下輸入),你會(huì)獲得無數(shù)個(gè)未經(jīng)加密的網(wǎng)絡(luò)攝像機(jī)監(jiān)視到的畫面。無聊的時(shí)候玩玩,可以滿足一下我們的好奇心。此外,打開這個(gè)站點(diǎn):www.opentopia.com/hiddencam.php,在“from”中選擇“China”,你還可以看到國內(nèi)的某處網(wǎng)絡(luò)攝像機(jī)畫面。

          *******************

          2:中英文字典

            Google提供了一個(gè)中英文字典,很方便使用。用戶可以按照下列方法查找詞義查找英文的中文詞義則輸入
          fy computer
          查找中文的英文詞義則輸入 翻譯 計(jì)算機(jī)

          3:條形碼查詢

            用戶輸入一個(gè)商品的條形碼就可以找到有關(guān)該產(chǎn)品的說明。

          4:漢語拼音輸入檢索
            為了方便使用中文的用戶在網(wǎng)上搜索,Google允許用戶直接在鍵盤上輸入漢語拼音來檢索相關(guān)事物,例如:
            輸入 shanghaishikebiao
            檢索結(jié)果提示:您是不是要找: 上海時(shí)刻表 
            這正是我們需要查找的關(guān)鍵詞,用戶可以據(jù)此瀏覽相關(guān)結(jié)果,這包括上海地區(qū)的各種交通工具的時(shí)刻表。如果需要查找更詳細(xì)的資料"上海飛機(jī)航班時(shí)刻表 ",則只要在原來的檢索結(jié)果"上海時(shí)刻表"中間輸入feijihangban ,例如:
            上海feijihangban時(shí)刻表
            Google的這項(xiàng)新功能,可以免除用戶在中文和拼音輸入方面的互相轉(zhuǎn)換。用戶在輸入拼音時(shí),不要留有空格,否則Google會(huì)誤認(rèn)為英文。Google把拼音與常用的字或者詞組一一對(duì)應(yīng),因此,過于生僻的字或詞組不適合于用這個(gè)方法查找
           
          5。 漢語拼音輸入檢索
            為了方便使用中文的用戶在網(wǎng)上搜索,Google允許用戶直接在鍵盤上輸入漢語拼音來檢索相關(guān)事物,例如:
            輸入 shanghaishikebiao
            檢索結(jié)果提示:您是不是要找: 上海時(shí)刻表 
            這正是我們需要查找的關(guān)鍵詞,用戶可以據(jù)此瀏覽相關(guān)結(jié)果,這包括上海地區(qū)的各種交通工具的時(shí)刻表。如果需要查找更詳細(xì)的資料"上海飛機(jī)航班時(shí)刻表 ",則只要在原來的檢索結(jié)果"上海時(shí)刻表"中間輸入feijihangban ,例如:
            上海feijihangban時(shí)刻表
            Google的這項(xiàng)新功能,可以免除用戶在中文和拼音輸入方面的互相轉(zhuǎn)換。用戶在輸入拼音時(shí),不要留有空格,否則Google會(huì)誤認(rèn)為英文。Google把拼音與常用的字或者詞組一一對(duì)應(yīng),因此,過于生僻的字或詞組不適合于用這個(gè)方法查找。

            6。 中英文字典
            經(jīng)常使用計(jì)算機(jī)的用戶手頭上自然會(huì)有一、兩個(gè)字典軟件,用于查找和翻譯中英文的詞義。作為一種使用頻率較高的工具,Google也提供了一個(gè)中英文字典,很方便使用。用戶可以按照下列方法查找詞義查找英文的中文詞義則輸入  fy  computer 查找中文的英文詞義則輸入  翻譯  計(jì)算機(jī)

            7。 天氣查詢
            天氣情況也是人們經(jīng)常要查詢的信息之一,Google 提供的天氣查詢來自于一個(gè)更新及時(shí)的中文氣象網(wǎng)站,適合中國人使用。用戶輸入中文和英文都可以查詢,例如要了解奧運(yùn)會(huì)期間雅典的天氣情況,可以按照下列方法輸入:
            雅典 天氣  athens tq 返回的查詢結(jié)果中會(huì)在第一條出現(xiàn)一個(gè) "雅典天氣預(yù)報(bào)",用戶點(diǎn)擊后就可以看到當(dāng)天雅典的天氣情況。如果地名相同者,用戶還需要進(jìn)行一次選擇。

            8。 股票查詢
            查詢股票的網(wǎng)站已經(jīng)很多了,Google提供的股票查詢只是更方便一些而已,用戶可以按照股票名稱、股票代碼或者股票名稱的聲母字母查詢,下列為查詢"中國聯(lián)通"股票行情的舉例。
            中國聯(lián)通 股票 zglt gp
            gp 600050

            9。 郵政編碼和區(qū)號(hào)查詢
            人們時(shí)常需要查詢郵政編碼和電話區(qū)號(hào),Google提供了這樣一個(gè)實(shí)用的功能,用戶據(jù)此能夠獲得所要查詢的省市名稱,郵政編碼及長途電話區(qū)號(hào),下面為查詢舉例:
            郵編 杭州       
            區(qū)號(hào) 紹興       
            yb  杭州 
            qh  紹興
            需要注意的是用戶只能查詢到城市級(jí)別的郵政編碼和區(qū)號(hào),而無法進(jìn)一步查詢區(qū)縣的具體信息。

            10。 手機(jī)歸屬地查詢
            用戶在輸入手機(jī)號(hào)碼后可以獲得號(hào)碼段、歸屬地、卡類型、郵政編碼和電話區(qū)號(hào)的信息,但是從實(shí)用的角度看,其中只有手機(jī)歸屬地的信息較為有用。

            11。 計(jì)算器使用
            Google有計(jì)算器的功能,例如在google檢索框中輸入45*86+35/7,就會(huì)得到結(jié)果:
            (45 * 86) + (35 / 7) = 3 875
            有興趣的用戶,或者經(jīng)常在計(jì)算機(jī)上進(jìn)行運(yùn)算的用戶不妨可以試一試。

            12。 購物檢索
            Google新開設(shè)的購物檢索稱之為Froogle,網(wǎng)址為http://froogle。google。com/
            用戶只要輸入商品的名稱,就可以看到該商品的圖片和價(jià)格,用戶還可以限定一種商品的價(jià)格進(jìn)行檢索,并且將檢索結(jié)果按需要從高價(jià)到低價(jià)排序列出,許多商品可以直接在網(wǎng)上訂購,這種圖文并茂的檢索購物方式較受用戶青睞。

            13。 美國實(shí)用生活信息查詢
            如果用戶生活在美國或者短期去美國出差和學(xué)習(xí),下面的查詢功能或許能對(duì)他們又幫助,因?yàn)檫@些檢索服務(wù)目前僅限于美國。
            14 地區(qū)代碼查詢
            用戶輸入美國的地區(qū)代碼,在返回的檢索結(jié)果中的第一項(xiàng)就是該地區(qū)的地圖,用戶可以通過不斷的點(diǎn)擊來找到一條具體的大街。 

             15 飛機(jī)航班查詢
            用戶輸入一家航空公司的名稱和航班號(hào),即可獲得該航班的出發(fā)地和目的地,起飛和到達(dá)時(shí)間,以及實(shí)際航行情況,目前是否開始檢票,抵達(dá)目的地候機(jī)大樓的艙門號(hào)。
            16 車牌號(hào)查詢
            用戶輸入車牌號(hào),可以獲得一輛車的名稱、型號(hào)、出廠年份,車身和發(fā)動(dòng)機(jī)情況。
            17 郵件查詢
            用戶輸入一個(gè)郵件的號(hào)碼,可以獲悉該郵件目前的狀況,譬如郵件已經(jīng)抵達(dá)或者正在路途上等。

            18。 檢索工具欄
            Google的檢索工具欄功能強(qiáng)大,有拖放和右擊檢索功能,新聞閱讀,廣告攔截,網(wǎng)站排名顯示和搜索字詞標(biāo)明等,工具欄可以附在瀏覽器下,使用更加方便。用戶可以首先在Google網(wǎng)站下載并安裝一個(gè)檢索工具欄,然后根據(jù)需要在工具欄的選項(xiàng)中進(jìn)行設(shè)置,我們推薦用戶使用這個(gè)檢索工具欄,它將給用戶帶來許多意想不到的方便。

            10.1 Google 新聞
            Google 的新聞來源于4500家報(bào)刊雜志和通訊社,在精選以后持續(xù)播出世界各國的新聞,每條新聞都有更新的時(shí)間,并聯(lián)接相關(guān)的新聞。用戶可以使用免費(fèi)的新聞通知服務(wù),通過電子郵件收到自己感興趣的新聞。
            10.2 網(wǎng)站排名
            Google 通過對(duì) Web 鏈接結(jié)構(gòu)和許多其它變量自動(dòng)計(jì)算,對(duì)網(wǎng)頁的重要程度進(jìn)行評(píng)定。網(wǎng)站排名根據(jù)這個(gè)評(píng)定能夠顯示用戶正在訪問的網(wǎng)站的重要程度,用一根綠色線條顯示,直觀而明確。
            10.3 搜索字詞標(biāo)明
            搜索字詞標(biāo)明通過鮮艷的色彩標(biāo)明用戶所檢索的字詞在每個(gè)網(wǎng)頁上的位置,便于用戶查閱,單擊"搜索字詞標(biāo)明"按鈕可以打開和關(guān)閉標(biāo)明狀態(tài)。
            10.4 拖放和右擊檢索
            拖放檢索功能使檢索更為方便,用戶可以把在網(wǎng)頁上所選取的字詞直接拖放到檢索框中,Google會(huì)自動(dòng)進(jìn)行檢索。對(duì)于與 Web瀏覽器同時(shí)運(yùn)行的許多文字處理應(yīng)用程序中的文字,也可以使用此功能。右擊檢索是指用戶可以在網(wǎng)頁上選取文字后,右擊鼠標(biāo),然后從彈出式菜單中選擇"Google 搜索"便可以自動(dòng)檢索。

            Google搜索引擎為我們提供了搜索的方便,她正在不斷推出新的服務(wù)功能,例如為移動(dòng)電話特別設(shè)計(jì)的無線搜尋等,相信隨著技術(shù)的不斷發(fā)展,我們會(huì)從中享受更多的搜索樂趣。

           

          posted @ 2006-02-15 15:22 Ben 閱讀(453) | 評(píng)論 (0)編輯 收藏

          [轉(zhuǎn)]TCP/IP協(xié)議介紹

          [以太網(wǎng)接口(畢業(yè)設(shè)計(jì))]TCP/IP協(xié)議介紹
          yzy1102 發(fā)表于 2006-1-16 19:33:00

              TCP/IP協(xié)議,或稱為TCP/IP協(xié)議棧,或互聯(lián)網(wǎng)協(xié)議系列。

          TCP/IP協(xié)議棧
          (按TCP/IP參考模型劃分)

          應(yīng)用層 FTP SMTP HTTP ...
          傳輸層 TCP UDP
          網(wǎng)絡(luò)層 IP ICMP ARP
          鏈路層 以太網(wǎng) 令牌環(huán) FDDI ...

              包含了一系列構(gòu)成互聯(lián)網(wǎng)基礎(chǔ)的網(wǎng)絡(luò)協(xié)議。這些協(xié)議最早發(fā)源于美國國防部的DARPA互聯(lián)網(wǎng)項(xiàng)目。TCP/IP字面上代表了兩個(gè)協(xié)議:TCP傳輸控制協(xié)議和IP互聯(lián)網(wǎng)協(xié)議。

              時(shí)間回放到1983年1月1日,在這天,互聯(lián)網(wǎng)的前身Arpanet中,TCP/IP協(xié)議取代了舊的網(wǎng)絡(luò)核心協(xié)議NCP(Network Core Protocol),從而成為今天的互聯(lián)網(wǎng)的基石。最早的的TCP/IP由Vinton Cerf和Robert Kahn兩位開發(fā),慢慢地通過競爭戰(zhàn)勝了其它一些網(wǎng)絡(luò)協(xié)議的方案,比如國際標(biāo)準(zhǔn)化組織ISO的OSI模型。TCP/IP的蓬勃發(fā)展發(fā)生在上世紀(jì)的90年代中期。當(dāng)時(shí)一些重要而可靠的工具的出世,例如頁面描述語言HTML和瀏覽器Mosaic,導(dǎo)致了互聯(lián)網(wǎng)應(yīng)用的飛束發(fā)展。

              隨著互聯(lián)網(wǎng)的發(fā)展,目前流行的IPv4協(xié)議(IP Version 4,IP版本四)已經(jīng)接近它的功能上限。IPv4最致命的兩個(gè)缺陷在與:

          • 地址只有32位,IP地址空間有限;
          • 不支持服務(wù)等級(jí)(Quality of Service, Qos)的想法,無法管理帶寬和優(yōu)先級(jí),故而不能很好的支持現(xiàn)今越來越多的實(shí)時(shí)的語音和視頻應(yīng)用。因此IPv6 (IP Version 6, IP版本六) 浮出海面,用以取代IPv4。

              TCP/IP成功的另一個(gè)因素在與對(duì)為數(shù)眾多的低層協(xié)議的支持。這些低層協(xié)議對(duì)應(yīng)與OSI模型 中的第一層(物理層)和第二層(數(shù)據(jù)鏈路層)。每層的所有協(xié)議幾乎都有一半數(shù)量的支持TCP/IP,例如: 以太網(wǎng)(Ethernet),令牌環(huán)(Token Ring),光纖數(shù)據(jù)分布接口(FDDI),端對(duì)端協(xié)議( PPP),X.25,幀中繼(Frame Relay),ATM,Sonet, SDH等。

          目錄
          1 TCP/IP協(xié)議棧組成
          2 必須協(xié)議
          3 推薦協(xié)議
          4 可選協(xié)議
          5 范例: 不同計(jì)算機(jī)運(yùn)行的不同協(xié)議
          6 參考文獻(xiàn)

             

           

           

           

              TCP/IP協(xié)議棧組成

              整個(gè)通信網(wǎng)絡(luò)的任務(wù),可以劃分成不同的功能塊,即抽象成所謂的 ” 層” 。用于互聯(lián)網(wǎng)的協(xié)議可以比照TCP/IP參考模型進(jìn)行分類。TCP/IP協(xié)議棧起始于第三層協(xié)議IP(互聯(lián)網(wǎng)協(xié)議) 。所有這些協(xié)議都在相應(yīng)的RFC文檔中討論及標(biāo)準(zhǔn)化。重要的協(xié)議在相應(yīng)的RFC文檔中均標(biāo)記了狀態(tài): “必須“ (required) ,“推薦“ (recommended) ,“可選“ (elective) 。其它的協(xié)議還可能有“ 試驗(yàn)“(experimental) 或“ 歷史“(historic) 的狀態(tài)。

              必須協(xié)議

              所有的TCP/IP應(yīng)用都必須實(shí)現(xiàn)IP和ICMP。對(duì)于一個(gè)路由器(router) 而言,有這兩個(gè)協(xié)議就可以運(yùn)作了,雖然從應(yīng)用的角度來看,這樣一個(gè)路由器 意義不大。實(shí)際的路由器一般還需要運(yùn)行許多“推薦“使用的協(xié)議,以及一些其它的協(xié)議。

              在幾乎所有連接到互聯(lián)網(wǎng)上的計(jì)算機(jī)上都存在的IPv4 協(xié)議出生在1981年,今天的版本和最早的版本并沒有多少改變。升級(jí)版IPv6 的工作始于1995年,目的在與取代IPv4。ICMP 協(xié)議主要用于收集有關(guān)網(wǎng)絡(luò)的信息查找錯(cuò)誤等工作。

              推薦協(xié)議

              每一個(gè)應(yīng)用層(TCP/IP參考模型 的最高層) 一般都會(huì)使用到兩個(gè)傳輸層協(xié)議之一: 面向連接的TCP傳輸控制協(xié)議和無連接的包傳輸?shù)腢DP用戶數(shù)據(jù)報(bào)文協(xié)議 。 其它的一些推薦協(xié)議有:

          • TELNET (Teletype over the Network, 網(wǎng)絡(luò)電傳) ,通過一個(gè)終端(terminal)登陸到網(wǎng)絡(luò)(運(yùn)行在TCP協(xié)議上)。
          • FTP (File Transfer Protocol, 文件傳輸協(xié)議) ,由名知義(運(yùn)行在TCP協(xié)議上) 。
          • SMTP (Simple Mail Transfer Protocol,簡單郵件傳輸協(xié)議) ,用來發(fā)送電子郵件(運(yùn)行在TCP協(xié)議上) 。
          • DNS (Domain Name Service,域名服務(wù)) ,用于完成地址查找,郵件轉(zhuǎn)發(fā)等工作(運(yùn)行在TCP和UDP協(xié)議上) 。
          • ECHO (Echo Protocol, 回繞協(xié)議) ,用于查錯(cuò)及測量應(yīng)答時(shí)間(運(yùn)行在TCP和UDP協(xié)議上) 。
          • NTP (Network Time Protocol,網(wǎng)絡(luò)時(shí)間協(xié)議) ,用于網(wǎng)絡(luò)同步(運(yùn)行在UDP協(xié)議上) 。
          • SNMP (Simple Network Management Protocol, 簡單網(wǎng)絡(luò)管理協(xié)議) ,用于網(wǎng)絡(luò)信息的收集和網(wǎng)絡(luò)管理。
          • BOOTP (Boot Protocol,啟動(dòng)協(xié)議) ,應(yīng)用于無盤設(shè)備(運(yùn)行在UDP協(xié)議上)。

              可選協(xié)議

              最常用的一些有

          • 支撐萬維網(wǎng)WWW的超文本傳輸協(xié)議HTTP,
          • 動(dòng)態(tài)配置IP地址的DHCP(Dynamic Host Configuration Protocol,動(dòng)態(tài)主機(jī)配置協(xié)議),
          • 收郵件用的POP3 (Post Office Protocol, version 3, 郵局協(xié)議) ,
          • 用于加密安全登陸用的SSH (Secure Shell,用于替代安全性差的TELNET) ,
          • 用于動(dòng)態(tài)解析以太網(wǎng)硬件地址的ARP (Address Resolution Protocol,地址解析協(xié)議) 。

              范例: 不同計(jì)算機(jī)運(yùn)行的不同協(xié)議

          • 一個(gè)簡單的路由器上可能會(huì)實(shí)現(xiàn)ARP, IP, ICMP, UDP, SNMP, RIP。
          • WWW用戶端使用ARP, IP, ICMP, UDP, TCP, DNS, HTTP, FTP。
          • 一臺(tái)用戶電腦上還會(huì)運(yùn)行如TELNET, SMTP, POP3, SNMP, ECHO, DHCP, SSH, NTP。
          • 無盤設(shè)備可能會(huì)在固件比如ROM中實(shí)現(xiàn)了ARP, IP, ICMP, UDP, BOOT, TFTP (均為面向數(shù)據(jù)報(bào)的協(xié)議,實(shí)現(xiàn)起來相對(duì)簡單)。

          TCP/IP基礎(chǔ)講座-1:1層,2層,3層?

              讀過關(guān)于網(wǎng)絡(luò)的課程的,都知道ISO-OSI 7層協(xié)議這個(gè)名詞,許多書籍都會(huì)具體的畫出那幅圖,然后標(biāo)注上物理層,數(shù)據(jù)鏈路層,網(wǎng)絡(luò)層等等.背的大家要死.但是卻又不知道具體這些層次干嗎用的勒?

              其實(shí)在互聯(lián)網(wǎng)中,由于實(shí)際使用的是TCP/IP模型,也就是DOD模型(現(xiàn)在不知道沒關(guān)系,后面會(huì)說).所以7層模型在現(xiàn)實(shí)網(wǎng)絡(luò)環(huán)境中只是一個(gè)理論上,學(xué)究派的東西.這個(gè)模型中,我們真正關(guān)心的是下面的3層.

          1.物理層 .哦.是的.這個(gè)名詞還算容易了解.網(wǎng)卡還有那些網(wǎng)線構(gòu)成了這一層.那些在網(wǎng)線中傳播的二進(jìn)制數(shù)據(jù)流是這層的具體表象.也就是說,這一層上面沒有什么協(xié)議(不是很精確的說法,但是你可以這么理解).有的都是電流而已.我們把兩臺(tái)機(jī)器用網(wǎng)線連起來.或者用HUB把機(jī)器都連起來,這些工作就是物理層的工作.

              有2個(gè)設(shè)備屬于物理層的,一個(gè)是中繼器,一個(gè)是HUB.大家知道.物理上面的連線距離一長就會(huì)產(chǎn)生電信號(hào)的衰減.為了重新加強(qiáng)這個(gè)信號(hào),我們就需要在一定距離之后加上一個(gè)信號(hào)放大器,這就是中繼器(repeater)

              恩...這個(gè)比較容易理解.repeater就是連接在2根網(wǎng)線之間的么.沒有做任何處理.所以只是一個(gè)物理設(shè)備.屬于1層的.

              那么集線器(HUB) 呢?這個(gè)怎么會(huì)是在1層???似乎非常難以理解.

              當(dāng)我說出HUB的本質(zhì),大家就能夠清楚了解了

              HUB的本質(zhì)其實(shí)只是一個(gè)多口中繼器(MULTI PORT REPEATER) .啊...這樣大家能夠理解了.HUB不叫多口中繼器其實(shí)只是為了銷售上面的策略.他的本質(zhì)就是連接多根網(wǎng)線的一個(gè)物理設(shè)備.也是不對(duì)經(jīng)過的電信號(hào)做任何邏輯處理的.

          2.數(shù)據(jù)鏈路層

              歐~這個(gè)名詞有些別扭了.DATA LINK層.英文似乎更加容易理解.

              這個(gè)層面上面的東西不再是電信號(hào)了.而是DATA了.對(duì),既然是DATA就有了邏輯關(guān)系了.這個(gè)層面上面的基本單位是幀(Frame) .這層和物理層的接觸是最緊密的.他是把從網(wǎng)線上面?zhèn)鬏數(shù)碾娏鬓D(zhuǎn)換成0和1的組合.

              物理層只是網(wǎng)卡對(duì)網(wǎng)線發(fā)出或者接受各種電平信號(hào),那就是說物理層是無法判別電流的來源和目標(biāo)的.那么把電流打成0和1的幀之后.里面就有邏輯數(shù)據(jù)了.有了數(shù)據(jù),就可以判別數(shù)據(jù)從何而來,到何處去.所以也就可以真正的形成LINK.

              既然可以判別地址,那么地址是按照什么來判別的呢?

              那就是最重要的概念之一:MAC地址

              大家肯定都聽說過我們的網(wǎng)卡都有MAC地址

              有些人可能也知道MAC地址都是唯一的.

              對(duì).MAC地址是全球唯一的.也就是說你的網(wǎng)卡雖然便宜.但是他也是世界上獨(dú)一無二的.

              有些人說他可以改MAC.那就不是唯一了.對(duì).雖然可以更改,那只是欺騙上層對(duì)封包里面的MAC地址進(jìn)行改寫.你網(wǎng)卡真正的MAC地址是固化的.無法修改的.

              我們有了MAC地址了.這樣就可以有針對(duì)性對(duì)所有連接在一起的計(jì)算機(jī)進(jìn)行通訊了.是的.我們終于可以在一個(gè)局域網(wǎng)內(nèi)通訊了.

              但是有個(gè)問題我們前面沒有提到.就是既然物理層傳輸?shù)氖请娦盘?hào).那么如果我有2臺(tái)機(jī)器一起發(fā)電信號(hào),信號(hào)豈不是混亂了么?

              非常正確.這個(gè)問題在網(wǎng)絡(luò)里面成為"碰撞",所以協(xié)議里面規(guī)定了如果你需要往外發(fā)數(shù)據(jù),一定需要先看看電纜里面有沒有別的信號(hào).如果沒有,那就可以發(fā).如果2者同時(shí)發(fā)送,檢測到碰撞之后2者分別等待一個(gè)隨機(jī)時(shí)間,然后重發(fā).這個(gè)就是重要的"碰撞檢測 ".

              哈.看來問題解決了.不是么.現(xiàn)在整個(gè)網(wǎng)絡(luò)可以正常運(yùn)行了.

              確實(shí)如此.但是如果連接在網(wǎng)絡(luò)上的計(jì)算機(jī)越來越多,那么碰撞的現(xiàn)象會(huì)越來越頻繁.這樣效率一定很低了.恩.這里還有一個(gè)重要概念"沖突域 ".在同一個(gè)物理上連接的網(wǎng)絡(luò)上的所有設(shè)備是屬于同一個(gè)沖突域的.

              接著就需要引入我們的2層設(shè)備來分割沖突域了.

              網(wǎng)橋(Bridge) 就是連接2個(gè)不同的物理網(wǎng)絡(luò)的.主要功能是在2個(gè)網(wǎng)絡(luò)之間轉(zhuǎn)發(fā)Frame.因?yàn)閺膶?shí)際中我們可以知道.其實(shí)很多時(shí)候并非整個(gè)網(wǎng)絡(luò)都在相互通訊.最多相互通訊的一組計(jì)算機(jī)我們可以分在一個(gè)小的沖突域內(nèi).這樣分割以后可以減少?zèng)_突域,也就相對(duì)的減少了沖突的機(jī)會(huì).而之間使用網(wǎng)橋來橋接,由于網(wǎng)橋兩邊的通訊不是非常頻繁,所以使用網(wǎng)橋來為2邊作為"代言人".這樣任意一個(gè)小網(wǎng)絡(luò)里面產(chǎn)生沖突的機(jī)會(huì)就少了.

              交換機(jī)(Switch)是我們最熟悉的設(shè)備了,交換機(jī)的本質(zhì)其實(shí)就是一個(gè)多口網(wǎng)橋(Multi port Bridge) .同理可得.交換機(jī)的每個(gè)口后面都是一個(gè)沖突域.我們都說交換機(jī)比HUB快,就是因?yàn)榻粨Q機(jī)分割了所有的沖突域.

              由于現(xiàn)在交換機(jī)非常便宜.所以一般我們都是直接在交換機(jī)的口上接計(jì)算機(jī).這樣每臺(tái)計(jì)算機(jī)都是一個(gè)獨(dú)立的沖突域.這樣碰撞的問題就沒有了.所以速度是比HUB快.

              而前面說過.2層設(shè)備主要是個(gè)轉(zhuǎn)發(fā)的功能.交換機(jī)的主要功能就是轉(zhuǎn)發(fā)包.而不是讓所有的沖突域直接物理連接.所以交換機(jī)有CPU,有內(nèi)存,可以對(duì)frame進(jìn)行處理等等.這些也是交換機(jī)和HUB的區(qū)別.


          3.網(wǎng)絡(luò)層

              我們前面的一些技術(shù)就可以構(gòu)建出局域網(wǎng)了.有了網(wǎng)絡(luò)層以后.數(shù)據(jù)才能夠真正的在整個(gè)世界間傳送

              由于倫納德?博薩卡(Leonard Bosack)和姍蒂?雷納(Sandy Lerner)為了解決他們之間的通信問題(關(guān)于路由器發(fā)明的版本有很多.你聽到的別的說法可能比這個(gè)說法更準(zhǔn)確,但是誰知道呢.呵呵).路由器被發(fā)明用來解決"信息孤島"問題.而且如果是由SWITCH來構(gòu)建整個(gè)網(wǎng)絡(luò),那么整個(gè)網(wǎng)絡(luò)將會(huì)有"中心節(jié)點(diǎn)",這樣也不符合ARPANET的初衷.所以我們有了這一層.(這樣說可能會(huì)感覺本末倒置,但是先這么理解吧.)

              這一層的基本單元是包(Packet) .所有的包都有一個(gè)IP頭.啊.聽起來很熟悉不是么.IP就是用來在這層上面標(biāo)識(shí)包的來源和目的地址的.

              這層的一個(gè)主要概念就是"路由 ",也就是和switch一樣,把包轉(zhuǎn)發(fā)到其他的地方.不過有個(gè)不同的地方,switch只有知道具體的MAC在哪里的情況下才能夠發(fā)送給指定的計(jì)算機(jī),而路由則不需要知道最終IP所在的計(jì)算機(jī)在哪個(gè)位置,只要知道那個(gè)途徑可以過去就可以工作.

              這3層構(gòu)建了整個(gè)網(wǎng)絡(luò)的基礎(chǔ).由于TCP/IP模型將最下面2層合并成為一層,所以在TCP/IP里面總共這2層也是整個(gè)構(gòu)架最基礎(chǔ)的內(nèi)容.而網(wǎng)絡(luò)方面要做的工作也都是針對(duì)于這2層做的.


          2: TCP/IP.真實(shí)世界的模型

              上一講里面我們說過OSI 7層模型只是一個(gè)理論模型,而實(shí)際中只需要保證7層的功能能夠?qū)崿F(xiàn),實(shí)際分層無需按照7層來分.而且如果真的分7層.那么數(shù)據(jù)處理的速度便要慢許多.

              在實(shí)際應(yīng)用中.使用最多的便是DoD模型.也成為TCP/IP協(xié)議簇

              DoD模型(Department Of Defanse Model 美國國防部模型) 顧名思義,是美國國防部設(shè)計(jì)的一個(gè)網(wǎng)絡(luò)模型.最早用于ARPANET.這些話可能在許多教材的第一章就會(huì)講了.但是一般教材對(duì)于DoD模型與OSI模型對(duì)應(yīng)關(guān)系都沒有講到.或者很多是模糊或者錯(cuò)誤的.

              在這里我就要描述一下2者對(duì)應(yīng)關(guān)系.OSI模型有7層我們已經(jīng)知道了,而DoD模型則只有4層.下面是對(duì)應(yīng)關(guān)系

              OSI                                  DoD

              7.Application     ┐     

              6.Presentation   |->       4. Application/Process

              5.Session         ┘     

              4.Transport       --->       3. Host to Host

              3.Network        --->       2. Internet

              2.Data Link      ┬->       1. Network Access

              1.Physical        ┘


              由于我不會(huì)制表符.所以圖有些難看.其實(shí)就是OSI的1.2層對(duì)應(yīng)DoD的第1層

          OSI的5.6.7對(duì)應(yīng)DoD的第4層

              其實(shí)這個(gè)還是比較容易記憶的

              由于物理層和數(shù)據(jù)鏈路層非常密切.所以分為一個(gè).然后上面依次對(duì)應(yīng),最上面的一大塊成為應(yīng)用層(處理層)

          現(xiàn)在我們有了一個(gè)可用的實(shí)際模型了.不過一般我們?cè)诿枋瞿硞€(gè)設(shè)備或者協(xié)議的時(shí)候.還是會(huì)使用OSI的模型,比如我們?cè)谟懻揝WITCH的時(shí)候,就會(huì)說他是一個(gè)2層的設(shè)備.而路由器是一個(gè)3層的設(shè)備,還會(huì)有一些特殊的設(shè)備,比如3層交換機(jī),4層交換機(jī).這些都是使用OSI模型進(jìn)行分類的.這點(diǎn)大家不要搞混淆了.


              我們一直聽說TCP或者UDP.還有什么SMTP.POP3.這些協(xié)議到底是在哪一層定義的那?接下來的一張圖會(huì)給大家一個(gè)非常清晰的概念了(不能算是圖拉 :D ).


              4. APPLICATION

              HTTP,FTP,telnet,SNMP,SMTP,POP3,DNS 等等


              3.Host to Host

              TCP,UDP


              2.internet

              ICMP,ARP,RARP,IP


              1.Network Access

              Ethernet,FastEthernet,Token Ring 等等

              恩...這下清楚了.讓我們從下至上來看看

              首先是最下層的.包括了以太網(wǎng),快速以太網(wǎng),還有現(xiàn)在的千M以太網(wǎng)等等的協(xié)議,這些協(xié)議規(guī)定了線纜的絞數(shù).連接方式等等物理層的東西.還有底層使用MAC通訊的方式等等.


              接下來是IP.ARP這些.IP在OSI模型的時(shí)候也說過.通過IP地址.我們?cè)谵D(zhuǎn)發(fā)包的時(shí)候無需知道具體目標(biāo)機(jī)的位置.而路由器自然會(huì)根據(jù)路由表來轉(zhuǎn)發(fā).最后一站一站的慢慢傳遞.達(dá)到最終目標(biāo).而ARP協(xié)議就是在IP和MAC之間轉(zhuǎn)換用的.

           我在上一章提過,由于有了路由器,IP,整個(gè)網(wǎng)絡(luò)才真正能夠覆蓋全球.所以這一層叫做internet大家也應(yīng)該容易記憶了.


              WOW.TCP,UDP是我們聽說最多的了.他是屬于控制網(wǎng)絡(luò)連接的.在OSI稱為Transport.傳輸層.在DoD內(nèi)是Host to Host 端對(duì)端.意思其實(shí)是一樣的.就是在在2臺(tái)計(jì)算機(jī)之間構(gòu)建出一個(gè)虛擬的通訊通道來.


              最上面一層就無窮無盡了.所有的最終應(yīng)用層的東西都在這里,你甚至可以定義你自己的協(xié)議類型.這些都是完全可以的.因?yàn)楸旧磉@一層就是提供給開發(fā)人員自行發(fā)揮的.只是上面列舉的都經(jīng)過標(biāo)準(zhǔn)化了.


              TCP包頭結(jié)構(gòu)

              源端口 16位

              目標(biāo)端口  16位

              序列號(hào)  32位

              回應(yīng)序號(hào)  32位

              TCP頭長度  4位

              reserved 6位

              控制代碼 6位

              窗口大小 16位

              偏移量 16位

              校驗(yàn)和 16位

              選項(xiàng)   32位(可選)

              這樣我們得出了TCP包頭的最小大小.就是20字節(jié).


              UDP包頭結(jié)構(gòu)

              源端口 16位

              目的端口 16位

              長度  16位

              校驗(yàn)和  16位

              恩...UDP的包小很多.確實(shí)如此.因?yàn)閁DP是非可靠連接.設(shè)計(jì)初衷就是盡可能快的將數(shù)據(jù)包發(fā)送出去.所以UDP協(xié)議顯得非常精簡.

              有一個(gè)問題,似乎這些頭里面怎么沒有IP地址啊.沒有IP地址這些包往哪里發(fā)送那?

              對(duì).你觀察的很仔細(xì).TCP和UDP的頭里面確實(shí)沒有任何IP信息.我們回頭想一下TCP和UDP是屬于DoD的哪一層的? 對(duì)了!是第3層. 而IP則位于模型的第二層.也就是他們兩者雖然有聯(lián)系.但是不屬于同一層.

              模型的一個(gè)重要規(guī)則就是.當(dāng)發(fā)送端發(fā)送一個(gè)數(shù)據(jù),上一層將數(shù)據(jù)傳往下一層的時(shí)候.上一層的包就成為了下一層包的數(shù)據(jù)部分.

              而到接受端接受到數(shù)據(jù).下一層將本層的頭部信息去掉后交給上一層去處理.

          那么我們來看看實(shí)際例子:

              假使我們通過SMTP協(xié)議發(fā)送數(shù)據(jù)AAA到另外一段.那么數(shù)據(jù)先會(huì)被加上SMTP的頭.成為[SMTP]AAA.往下發(fā)送到TCP層.成為[TCP][SMTP]AAA.再往下送到internet層[IP][TCP][SMTP]AAA.然后成為[MAC][IP][TCP][SMTP]AAA

              這樣通過enternet或者FastEnternet發(fā)送到路由器.路由器得到后替換自己的MAC地址上去.傳到下一級(jí)的路由器.這樣經(jīng)過長途跋涉.最終這個(gè)數(shù)據(jù)流到達(dá)目標(biāo)機(jī).


              目標(biāo)機(jī)先從下面一層開始.去掉MAC,成為[IP][TCP][SMTP]AAA往上到IP層,恩,比對(duì)后是發(fā)送給我這個(gè)IP的.去掉,成為[TCP][SMTP]AAA.TCP接到了查看校驗(yàn)和,沒錯(cuò).往上[SMTP]AAA.最后SMTP協(xié)議去解釋.得到了AAA.


              萬里長征終于結(jié)束.我們也將AAA發(fā)送到了目標(biāo)機(jī).大家也應(yīng)該明白了為何TCP包頭和UDP包頭里面沒有IP地址那?因?yàn)镮P位于他們下面一層.TCP和UDP的包頭信息是作為IP包的數(shù)據(jù)段來傳送的.


              IP層可不管那許多.他只管他那層的協(xié)議,也就是管把從上面層來的數(shù)據(jù)加上自己的頭,傳到下面一層.把從下面一層來的數(shù)據(jù)去掉頭.傳到上面一層.


              每層都是這么干的.完美的契合完成了數(shù)據(jù)包的最終旅程.

          TCP/IP的通訊協(xié)議

            這部分簡要介紹一下TCP/IP的內(nèi)部結(jié)構(gòu)。TCP/IP協(xié)議組之所以流行,部分原因是因?yàn)樗梢杂迷诟鞣N各樣的信道和底層協(xié)議(例如T1和X.25、以太網(wǎng)以及RS-232串行接口)之上。確切地說,TCP/IP協(xié)議是一組包括TCP協(xié)議和IP協(xié)議,UDP(User Datagram Protocol)協(xié)議、ICMP(Internet Control Message Protocol)協(xié)議和其他一些協(xié)議的協(xié)議組。

          TCP/IP整體構(gòu)架概述

            TCP/IP協(xié)議并不完全符合OSI的七層參考模型。傳統(tǒng)的開放式系統(tǒng)互連參考模型,是一種通信協(xié)議的7層抽象的參考模型,其中每一層執(zhí)行某一特定任務(wù)。該模型的目的是使各種硬件在相同的層次上相互通信。這7層是:物理層、數(shù)據(jù)鏈路層、網(wǎng)路層、傳輸層、話路層、表示層和應(yīng)用層。而TCP/IP通訊協(xié)議采用了4層的層級(jí)結(jié)構(gòu),每一層都呼叫它的下一層所提供的網(wǎng)絡(luò)來完成自己的需求。這4層分別為:

            應(yīng)用層:應(yīng)用程序間溝通的層,如簡單電子郵件傳輸(SMTP)、文件傳輸協(xié)議(FTP)、網(wǎng)絡(luò)遠(yuǎn)程訪問協(xié)議(Telnet)等。

            傳輸層:在此層中,它提供了節(jié)點(diǎn)間的數(shù)據(jù)傳送服務(wù),如傳輸控制協(xié)議(TCP)、用戶數(shù)據(jù)報(bào)協(xié)議(UDP)等,TCP和UDP給數(shù)據(jù)包加入傳輸數(shù)據(jù)并把它傳輸?shù)较乱粚又校@一層負(fù)責(zé)傳送數(shù)據(jù),并且確定數(shù)據(jù)已被送達(dá)并接收。

            互連網(wǎng)絡(luò)層:負(fù)責(zé)提供基本的數(shù)據(jù)封包傳送功能,讓每一塊數(shù)據(jù)包都能夠到達(dá)目的主機(jī)(但不檢查是否被正確接收),如網(wǎng)際協(xié)議(IP)。

            網(wǎng)絡(luò)接口層:對(duì)實(shí)際的網(wǎng)絡(luò)媒體的管理,定義如何使用實(shí)際網(wǎng)絡(luò)(如Ethernet、Serial Line等)來傳送數(shù)據(jù)。

          TCP/IP中的協(xié)議

            以下簡單介紹TCP/IP中的協(xié)議都具備什么樣的功能,都是如何工作的:

            1. IP

            網(wǎng)際協(xié)議IP是TCP/IP的心臟,也是網(wǎng)絡(luò)層中最重要的協(xié)議。

            IP層接收由更低層(網(wǎng)絡(luò)接口層例如以太網(wǎng)設(shè)備驅(qū)動(dòng)程序)發(fā)來的數(shù)據(jù)包,并把該數(shù)據(jù)包發(fā)送到更高層---TCP或UDP層;相反,IP層也把從TCP或UDP層接收來的數(shù)據(jù)包傳送到更低層。IP數(shù)據(jù)包是不可靠的,因?yàn)镮P并沒有做任何事情來確認(rèn)數(shù)據(jù)包是按順序發(fā)送的或者沒有被破壞。IP數(shù)據(jù)包中含有發(fā)送它的主機(jī)的地址(源地址)和接收它的主機(jī)的地址(目的地址)。

            高層的TCP和UDP服務(wù)在接收數(shù)據(jù)包時(shí),通常假設(shè)包中的源地址是有效的。也可以這樣說,IP地址形成了許多服務(wù)的認(rèn)證基礎(chǔ),這些服務(wù)相信數(shù)據(jù)包是從一個(gè)有效的主機(jī)發(fā)送來的。IP確認(rèn)包含一個(gè)選項(xiàng),叫作IP source routing,可以用來指定一條源地址和目的地址之間的直接路徑。對(duì)于一些TCP和UDP的服務(wù)來說,使用了該選項(xiàng)的IP包好象是從路徑上的最后一個(gè)系統(tǒng)傳遞過來的,而不是來自于它的真實(shí)地點(diǎn)。這個(gè)選項(xiàng)是為了測試而存在的,說明了它可以被用來欺騙系統(tǒng)來進(jìn)行平常是被禁止的連接。那么,許多依靠IP源地址做確認(rèn)的服務(wù)將產(chǎn)生問題并且會(huì)被非法入侵。

            2. TCP

            如果IP數(shù)據(jù)包中有已經(jīng)封好的TCP數(shù)據(jù)包,那么IP將把它們向‘上’傳送到TCP層。TCP將包排序并進(jìn)行錯(cuò)誤檢查,同時(shí)實(shí)現(xiàn)虛電路間的連接。TCP數(shù)據(jù)包中包括序號(hào)和確認(rèn),所以未按照順序收到的包可以被排序,而損壞的包可以被重傳。

            TCP將它的信息送到更高層的應(yīng)用程序,例如Telnet的服務(wù)程序和客戶程序。應(yīng)用程序輪流將信息送回TCP層,TCP層便將它們向下傳送到IP層,設(shè)備驅(qū)動(dòng)程序和物理介質(zhì),最后到接收方。

            面向連接的服務(wù)(例如Telnet、FTP、rlogin、X Windows和SMTP)需要高度的可靠性,所以它們使用了TCP。DNS在某些情況下使用TCP(發(fā)送和接收域名數(shù)據(jù)庫),但使用UDP傳送有關(guān)單個(gè)主機(jī)的信息。

            3.UDP

            UDP與TCP位于同一層,但對(duì)于數(shù)據(jù)包的順序錯(cuò)誤或重發(fā)。因此,UDP不被應(yīng)用于那些使用虛電路的面向連接的服務(wù),UDP主要用于那些面向查詢---應(yīng)答的服務(wù),例如NFS。相對(duì)于FTP或Telnet,這些服務(wù)需要交換的信息量較小。使用UDP的服務(wù)包括NTP(網(wǎng)落時(shí)間協(xié)議)和DNS(DNS也使用TCP)。

            欺騙UDP包比欺騙TCP包更容易,因?yàn)閁DP沒有建立初始化連接(也可以稱為握手)(因?yàn)樵趦蓚€(gè)系統(tǒng)間沒有虛電路),也就是說,與UDP相關(guān)的服務(wù)面臨著更大的危險(xiǎn)。

            4.ICMP

            ICMP與IP位于同一層,它被用來傳送IP的的控制信息。它主要是用來提供有關(guān)通向目的地址的路徑信息。ICMP的‘Redirect’信息通知主機(jī)通向其他系統(tǒng)的更準(zhǔn)確的路徑,而‘Unreachable’信息則指出路徑有問題。另外,如果路徑不可用了,ICMP可以使TCP連接‘體面地’終止。PING是最常用的基于ICMP的服務(wù)。

            5. TCP和UDP的端口結(jié)構(gòu)

            TCP和UDP服務(wù)通常有一個(gè)客戶/服務(wù)器的關(guān)系,例如,一個(gè)Telnet服務(wù)進(jìn)程開始在系統(tǒng)上處于空閑狀態(tài),等待著連接。用戶使用Telnet客戶程序與服務(wù)進(jìn)程建立一個(gè)連接。客戶程序向服務(wù)進(jìn)程寫入信息,服務(wù)進(jìn)程讀出信息并發(fā)出響應(yīng),客戶程序讀出響應(yīng)并向用戶報(bào)告。因而,這個(gè)連接是雙工的,可以用來進(jìn)行讀寫。

            兩個(gè)系統(tǒng)間的多重Telnet連接是如何相互確認(rèn)并協(xié)調(diào)一致呢?TCP或UDP連接唯一地使用每個(gè)信息中的如下四項(xiàng)進(jìn)行確認(rèn):

            源IP地址  發(fā)送包的IP地址。

            目的IP地址 接收包的IP地址。

            源端口   源系統(tǒng)上的連接的端口。

            目的端口  目的系統(tǒng)上的連接的端口。

            端口是一個(gè)軟件結(jié)構(gòu),被客戶程序或服務(wù)進(jìn)程用來發(fā)送和接收信息。一個(gè)端口對(duì)應(yīng)一個(gè)16比特的數(shù)。服務(wù)進(jìn)程通常使用一個(gè)固定的端口,例如,SMTP使用25、Xwindows使用6000。這些端口號(hào)是‘廣為人知’的,因?yàn)樵诮⑴c特定的主機(jī)或服務(wù)的連接時(shí),需要這些地址和目的地址進(jìn)行通訊。


          posted @ 2006-02-15 11:13 Ben 閱讀(1415) | 評(píng)論 (0)編輯 收藏

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

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

              一、什么是RSS?

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

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

              小知識(shí)

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

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

              二、RSS的歷史

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

              最初的0.90版本RSS是由Netscape公司設(shè)計(jì)的,目的是用來建立一個(gè)整合了各主要新聞?wù)军c(diǎn)內(nèi)容的門戶,但是0.90版本的RSS規(guī)范過于復(fù)雜,而一個(gè)簡化的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作為一種基本的功能也被越來越多的網(wǎng)站和博客軟件支持。

              在UserLand公司接手并不斷開發(fā)RSS的同時(shí),很多的專業(yè)人士認(rèn)識(shí)到需要通過一個(gè)第三方、非商業(yè)的組織,把RSS發(fā)展成為一個(gè)通用的規(guī)范,并進(jìn)一步標(biāo)準(zhǔn)化。于是2001年一個(gè)聯(lián)合小組在0.90版本RSS的開發(fā)原則下,以W3C新一代的語義網(wǎng)技術(shù)RDF(Resource Description Framework)為基礎(chǔ),對(duì)RSS進(jìn)行了重新定義,發(fā)布RSS1.0,并將RSS定義為“RDF Site Summary”。但是這項(xiàng)工作沒有與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è)陣營,由于分歧的存在和RSS 0.9x/2.0的廣泛應(yīng)用現(xiàn)狀,RSS 1.0還沒有成為標(biāo)準(zhǔn)化組織的真正標(biāo)準(zhǔn)。

              三、RSS可以干什么?

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

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

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

              三、RSS閱讀器

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

              第一類大多數(shù)閱讀器是運(yùn)行在計(jì)算機(jī)桌面上的單機(jī)應(yīng)用程序,通過所訂閱網(wǎng)站和博客(blog)中的新聞供應(yīng),可自動(dòng)、定時(shí)地更新新聞標(biāo)題。在該類閱讀器中,有Awasu、FeedDemon和RSSReader這三款流行的單機(jī)版閱讀器都提供免費(fèi)試用版和付費(fèi)高級(jí)版,另外,新華網(wǎng)在不久前也推出了一款RSS閱讀器,它不僅是完全是中文界面,而且目前還是完全的免費(fè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)站系列)也能通過互相調(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聚合,就是通過軟件工具的方法從網(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的未來發(fā)展

              隨著越來越多的站點(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 閱讀(186) | 評(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è)能夠通過Web進(jìn)行調(diào)用的API。這就是說,你能夠用編程的方法通過Web來調(diào)用這個(gè)應(yīng)用程序。   對(duì)Web service 更精確的解釋: Web services是建立可...  閱讀全文

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

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

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

          posted @ 2006-01-11 16:40 Ben 閱讀(424) | 評(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頁,然后將該html改成jsp,將數(shù)據(jù)部分動(dòng)態(tài)填入即可,不用很辛苦的調(diào)整格式
           
          word頁面只要在jsp頭設(shè)置如下指令:
          <%@page contentType="application/msword;charset=GBK" %>
           
          excel如下:
          <%@page contentType="application/vnd.ms-excel;charset=GBK" %>

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

          此方法優(yōu)勢是模板設(shè)計(jì)、調(diào)整方便,無需在服務(wù)器端使用復(fù)雜的POI或jxl技術(shù),也無需在客戶端使用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&
           
          簡單示例:

          使用word建立一文檔,畫表格如下:
          ----------------------------
          | 用戶名 | 真實(shí)姓名 | 性別 |
          ----------------------------
          | guest  | 路人甲   | 男   |
          ----------------------------
          保存為Web頁test.htm, 將test.htm改名為test.jsp,修改其中g(shù)uest、路人甲、男為從數(shù)據(jù)庫動(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ù)庫
          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 閱讀(465) | 評(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越來越熱,關(guān)于XML的基礎(chǔ)教程網(wǎng)絡(luò)上也隨處可見。可是一大堆的概念和術(shù)語往往讓人望而生畏,很多朋友問我:XML到底有什么用,我們是否需要學(xué)習(xí)它?我想就我個(gè)人學(xué)習(xí)過程的心得和經(jīng)驗(yàn),寫一篇比較全面的介紹文章。首先有兩點(diǎn)是需要肯定的: 

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

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

          提綱

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

          第一章:XML快速入門

          一. 什么是XML? 

          二. XML是新概念嗎? 

          三. 使用XML有什么好處? 

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

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

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

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

          一. 什么是XML?

           

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

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

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

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

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

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

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

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

          <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>的語句就是自己創(chuàng)建的標(biāo)記(tags),它們和HTML標(biāo)記不一樣,例如這里的< title>是文章標(biāo)題的意思,HTML里的< title>是頁面標(biāo)題。

          二. XML是新概念嗎? 

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

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

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


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


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

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

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


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

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


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

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

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

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

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

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

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

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

          XML非常簡單,學(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。分別說明文章的標(biāo)題,作者,郵箱和日期。當(dāng)然,你可以用中文來定義這些標(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)友都可以直接寫出這樣簡單的XML文檔。

          另外,學(xué)習(xí)XML還必須掌握一種頁面腳本語言,常見的就是javascript和VB script。因?yàn)閄ML數(shù)據(jù)是使用script實(shí)現(xiàn)HTML中調(diào)用和交互的。我們看一個(gè)最簡單的例子(例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無比的強(qiáng)大的功能。

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

           

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

           


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

           

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

           


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

           

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

           

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

           

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

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

          1.

          sample


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


          3.< td>sample< /TD>


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


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

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

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

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

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

          所以上列語句在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)頁不能被顯示。各瀏覽器開發(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ò)信息頁面:


          <?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的簡單應(yīng)用。 

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

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

          第二章 XML概念

          導(dǎo)言 

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

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

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

          XML的第一個(gè)詞是"擴(kuò)展性",這正是XML強(qiáng)大的功能和彈性的原因。 
          在HTML里,有許多固定的標(biāo)記,我們必須記住然后使用它們,你不能使用HTML規(guī)范里沒有的標(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)頁),而XML卻沒有任何標(biāo)記可以學(xué),也很少有文檔的標(biāo)記是一模一樣的。我們?cè)趺崔k?呵呵,沒有就自己創(chuàng)建呀。一旦你真正開始寫XML文檔,你會(huì)發(fā)現(xiàn)隨心所欲的創(chuàng)造新標(biāo)記也是一份很有趣的事。你可以建立有自己特色的標(biāo)記,甚至建立你自己的HTML語言。 

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

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

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

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

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

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

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

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

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

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

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

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

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

          "結(jié)構(gòu)化"聽起來太抽象了,我們這樣理解,結(jié)構(gòu)化就是為你的文檔建立一個(gè)框架,就象寫文章先寫一個(gè)提綱。結(jié)構(gòu)化使你的文檔看起來不會(huì)雜亂無章,每一部分都緊密聯(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í)本身的含義與它描述的信息相分離。 

          我們來看一個(gè)簡單的例子幫助理解: 
          <?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>,分支和頁是子元素,如<chapter>和<para>。 

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

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

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

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

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

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

          六.顯示 

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

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

          1.XSL 

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

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

          2.CSS 

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

          3.Behaviors 

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

          七.DOM 

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

          面向?qū)ο蟮乃枷敕椒ㄒ呀?jīng)非常流行了,在編程語言(例如java,js)中,都運(yùn)用面向?qū)ο蟮木幊趟枷搿T赬ML中,就是要將網(wǎng)頁也作為一個(gè)對(duì)象來操作和控制,我們可以建立自己的對(duì)象和模板。與對(duì)象進(jìn)行交流,如何命令對(duì)象,就要用到API。API全稱Application Programming Interface,它是訪問和操作對(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)簡要的講述了一些XML的基本原理,我們來看看它們之間的關(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è)整體的大致的概念。通過這一章的學(xué)習(xí),我們可能感覺到XML似乎更偏向數(shù)據(jù)處理,更方便程序員學(xué)習(xí)。實(shí)際情況也是這樣的,XML設(shè)計(jì)的目的就是用來方便的共享和交互數(shù)據(jù)的。下一章,我們將系統(tǒng)的了解關(guān)于XML的各種術(shù)語。歡迎您繼續(xù)瀏覽。

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

          第三章 XML的術(shù)語

          提綱: 


          導(dǎo)言 

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

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

          導(dǎo)言 


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

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

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

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


          舉例說明:

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


          1.Element(元素):

          元素在HTML我們已經(jīng)有所了解,它是組成HTML文檔的最小單位,在XML中也一樣。一個(gè)元素由一個(gè)標(biāo)識(shí)來定義,包括開始和結(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í)是用來定義元素的。在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)一步的描述和說明,一個(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的聲明語句就象這樣:

          <?xml version="1.0"?> 


          5.DTD(文件類型定義) 

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

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


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

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

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

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

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

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

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


          7.Valid XML(有效的XML)

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

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

          有效的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ù)語

          什么是DTD,我們上面已經(jīng)簡略提到。DTD是一種保證XML文檔格式正確的有效方法,可以比較XML文檔和DTD文件來看文檔是否符合規(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說明語句中的PUBLIC屬性)。比如,兩個(gè)相同行業(yè)不同地區(qū)的人使用同一個(gè)DTD文件來作為文檔創(chuàng)建規(guī)范,那么他們的數(shù)據(jù)就很容易交換和共享。網(wǎng)上有其他人想補(bǔ)充數(shù)據(jù),也只需要根據(jù)公用的DTD規(guī)范來建立文檔,就立刻可以加入。

          目前,已經(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也是很簡單的一件事,一般只需要定義4-5個(gè)元素就可以了。

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

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

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

          我們有一個(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文檔的語法一起介紹。 


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

          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)提到過,它是文檔元素分級(jí)結(jié)構(gòu)的形象表示。一個(gè)文檔結(jié)構(gòu)樹包含根元素,根元素是最頂級(jí)的元素,(就是緊接著XML聲明語句后的第一個(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>這樣沒有包含任何子元素的最后一級(jí)元素我們也稱之為"頁元素"。
          4.Parser(解析軟件) 

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

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

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


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

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

          第四章 XML語法 

          提綱: 

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

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

          一.XML語法規(guī)則

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

          規(guī)則2:是否有DTD文件
          如果文檔是一個(gè)"有效的XML文檔"(見上一章),那么文檔一定要有相應(yīng)DTD文件,并且嚴(yán)格遵守DTD文件制定的規(guī)范。DTD文件的聲明語句緊跟在XML聲明語句后面,格式如下:
          <!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ì)之間沒有內(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語法

          二.元素的語法 

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

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

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

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

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

          4.名稱中不能包含空格 

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

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

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

          2.名稱盡量簡短。 

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

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

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

          三.注釋的語法 

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

          注釋的語法如下: 

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

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

          四.CDATA的語法 

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

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

          例如: 

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

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


          第四章 XML語法

          五.Namespaces的語法 

          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è)問題,我們引進(jìn)了namespaces這個(gè)概念。namespaces通過給標(biāo)識(shí)名稱加一個(gè)網(wǎng)址(URL)定位的方法來區(qū)別這些名稱相同的標(biāo)識(shí)。 
          Namespaces同樣需要在XML文檔的開頭部分聲明,聲明的語法如下:
          <document xmlns:yourname='URL'>
          其中yourname是由你定義的namespaces的名稱,URL就是名字空間的網(wǎng)址。
          假設(shè)上面的"桌子<table>"文檔來自http://www.zhuozi.com,我們就可以聲明為
          <document xmlns:zhuozi='http://www.zhuozi.com&#39;> 
          然后在后面的標(biāo)識(shí)中使用定義好的名字空間:
          <zhuozi:table>wood table</table>
          這樣就將這兩個(gè)<table>區(qū)分開來。注意的是:設(shè)置URL并不是說這個(gè)標(biāo)識(shí)真的要到那個(gè)網(wǎng)址去讀取,僅僅作為一種區(qū)別的標(biāo)志而已。

          六.entity的語法

          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語句就可以了。
          XML定義了兩種類型的entity。一種是我們這里說的普通entity,在XML文檔中使用;另一種是參數(shù)entity,在DTD文件中使用。
          entity的定義語法為:
          <!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)用的方法,語法象這樣:
          <!DOCTYPE copyright [
          <!ENTITY copyright SYSTEM "http://www.sample.com/copyright.xml"> 
          ]
          >
          定義好的entity在文檔中的引用語法為:&entity-name;
          例如,上面定義的版權(quán)信息,調(diào)用時(shí)寫作?copyright;
          完整的例子如下,你可以copy下來存為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語法

          七.DTD的語法 

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

          1.設(shè)置元素 

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

          說明: 

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

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

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

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


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

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

           最后,我們來總結(jié)一些前四章學(xué)習(xí)的內(nèi)容,寫一個(gè)包含DTD,XML,以及Script的簡單實(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,無線通信應(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è)簡單的實(shí)例,不包含服務(wù)器端程序。目的在于讓您對(duì)XML的數(shù)據(jù)操作能力有一個(gè)感性的認(rèn)識(shí)。 

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

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

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

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

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

          第一步:定義新標(biāo)識(shí)。
          根據(jù)實(shí)際的CD數(shù)據(jù),首先新建一個(gè)名為<CD>的標(biāo)識(shí);其次建立它相關(guān)的數(shù)據(jù)標(biāo)識(shí),分別是:CD名稱<Title>,演唱者<Artist>,出版年代<Year>,國家<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文件來定義,所以可以省略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包含多個(gè)CD子元素,而子元素CD又依次包含Title, Artist, Year, Country, Company, Price 六個(gè)子元素,它們的內(nèi)容都定義為文本(字符,數(shù)字,文本)。(注:具體的語法說明可以看上一章關(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"?>聲明語句表明這是一個(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是通過在HTML中的object物件來支持插入XML,并通過js的XMLDocument.load()方法來導(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í)來將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來完成兩個(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í),我們來總結(jié)一下前面五個(gè)章節(jié),分別是XML快速入門,XML的概念原理,XML的術(shù)語,XML的語法和本章的實(shí)例解析。到這里,教程部分就結(jié)束了。在寫作過程中,阿捷盡最大努力將有關(guān)XML概念講得通俗易懂,盡量把自己的理解告訴給大家,但因?yàn)楸救藢W(xué)習(xí)XML時(shí)間也不長,對(duì)整個(gè)XML的技術(shù)把握還不夠系統(tǒng)和深入,所以難免有疏漏的地方,請(qǐng)大家指正和諒解,謝謝!
          <完>

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

          金山詞霸2000使用密技兩則

          金山詞霸2000使用密技兩則

          loveaniu

              
           

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

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

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

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

            許多朋友都希望能在看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,然后按它所說的一步一步做下去就行了,如果還是不行的話那就只好手工安裝了,找到你的Acrobat安裝目錄,將XDICPI32.API拷入其reader\plug_ins目錄下就行了。

          硅谷動(dòng)力eNet

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

          主站蜘蛛池模板: 公安县| 微博| 新竹市| 茶陵县| 芦溪县| 隆安县| 剑川县| 南丹县| 庐江县| 洛隆县| 忻城县| 遵义县| 永修县| 固始县| 屏山县| 饶河县| 宜章县| 那曲县| 中阳县| 宝山区| 石台县| 台前县| 南川市| 金门县| 陆川县| 华蓥市| 金湖县| 基隆市| 太康县| 葵青区| 旬阳县| 射洪县| 晋城| 乐都县| 万州区| 阿城市| 白山市| 历史| 循化| 富民县| 吉安县|