【正文】
DT_Net_StartListen(ServerIP,ServerPort)。 參數(shù): nIDSocket- Client 端套接字句柄 (8) 斷開連接 DWORD DT_Net_DisConnect(unsigned int nIDSocket)。 (4) 服務(wù)器啟動(dòng)監(jiān)聽 DWORD DT_Net_StartListen(LPCTSTR pszLocalIP, unsigned long nSvrPort)。 參數(shù): bIsServer 表示是否將此 Socket 端用作服務(wù) 返回: 0 或者錯(cuò)誤代碼 (2) 設(shè)置回調(diào)函數(shù)接口 DWORD DT_Net_SetCallBack(LPVOID pParam,LPNET_ ACCEPT_CALLBACK pAccept,LPNET_RECV_CALLBACK pRevc,LPNET_DISCONN_CALLBACK pDisConnect,LPNET_ LOG_CALLBACK pLogInfo)。 系統(tǒng)實(shí)現(xiàn) 網(wǎng)絡(luò)文件傳輸 ? 動(dòng)態(tài)鏈接庫(kù) 本系統(tǒng)使用 VC++開發(fā)專門用于網(wǎng)絡(luò)文件傳輸?shù)膭?dòng)態(tài)鏈接庫(kù)( DLL),基于對(duì)字節(jié)流的處理可以傳輸任何文件,因此對(duì)于 XML 文件的傳輸來(lái)說(shuō)是透明的。XML 文件封裝是指將要發(fā)送的數(shù)據(jù)按照一定的協(xié)議打包組裝成一個(gè)特定格式的XML 文件,解析是指對(duì)一個(gè) XML 文件按照特定的協(xié)議進(jìn)行分析解讀,還原出其中所描述的數(shù)據(jù)。應(yīng)用程序通常通過(guò) Socket 向網(wǎng)絡(luò)發(fā)出請(qǐng)求或者應(yīng)答網(wǎng)絡(luò)請(qǐng)求,可以通過(guò) Socket 傳送數(shù)據(jù),進(jìn)一歨封裝成傳送任何文件(字節(jié)流)的功能。 Socket 是Windows 與網(wǎng)絡(luò)的接口。 系統(tǒng)模型的建立 根據(jù)監(jiān)控系統(tǒng)的功能要求和 XML 的特點(diǎn),將系統(tǒng)的數(shù)據(jù)通信問(wèn)題轉(zhuǎn)化為如何實(shí)現(xiàn)網(wǎng)絡(luò)文件傳輸和如何使用 XML 文件表示數(shù)據(jù)這兩個(gè)子問(wèn)題。 (3) 站點(diǎn) → 站點(diǎn) 有些事務(wù)可能需要兩個(gè)站點(diǎn)共同完成 (如在站點(diǎn) A 稱得皮重,在站點(diǎn) B 稱得毛重,兩個(gè)站點(diǎn)要相 互交換數(shù)據(jù)才能得到凈重值 ),因此在站點(diǎn)之間也會(huì)發(fā)送數(shù)據(jù),而這些數(shù)據(jù)監(jiān)控中心是不關(guān)心地。在分布式監(jiān)控系統(tǒng)中,數(shù)據(jù)通信是最基本的問(wèn)題。 在解決一個(gè)監(jiān)控系統(tǒng)的信息傳輸問(wèn)題時(shí),遇到了一些困難,主要的原因是該系統(tǒng)中的數(shù)據(jù)類型多,發(fā)送的方向雜,控制起來(lái)比較繁瑣。 本章小結(jié) 在分析了現(xiàn)實(shí)網(wǎng)絡(luò)中 XML 數(shù)據(jù)傳輸中所存在問(wèn)題的基礎(chǔ)上,本章深刻闡述了XML 解析的必要性并講解了 XML 解析技術(shù)的基本理論,提出了 XML 解析器的工作架構(gòu),并對(duì)其工作模式進(jìn)行了具體功能的講解。With NULL content handler 的意思就是指 SAX 解析中沒有插入任何額外的處理邏bit 60 bit 51 bit 43 令牌類型: 4bit bit 63 bit 29 bit 0 bit 32 bit 42 bit 52 bit 59 前綴長(zhǎng)度: 9bit 令牌起始位置: 30bit 令牌長(zhǎng)度: 20bit 序列長(zhǎng)度: 11bit 嵌套深度: 8bit 圖 VTDXML 一字節(jié)信息示意圖 26 XML 快速解析技術(shù) 輯,即 SAX 的最高速度。 VTDXML 原理結(jié)構(gòu) VTDXML 的原理并不復(fù)雜,而且很巧妙。盡管 SAX 速度較快,但它的僅能前向查詢屬性,使得 SAX 的性能通常不能夠符合真實(shí)通信情況中所要求的性能標(biāo)準(zhǔn)。舉例來(lái)講,當(dāng)開始一個(gè)涉及 XML 工程的工作時(shí),首先要選擇一個(gè)處理模型。一條 VTD 格式的信息大小是 64 比特的整數(shù)倍,其中包含有 XML 令牌長(zhǎng)、起始偏移量、類型和 XML 信息中令牌嵌套深度。不同于現(xiàn)行的 XML 處理技術(shù), VTDXML 能夠?qū)崿F(xiàn)數(shù)據(jù)的隨機(jī)存取,而不會(huì)導(dǎo)致過(guò)多的資源浪費(fèi)。前面講了,DOM 和 SAX,兩者都需要構(gòu)建一個(gè)復(fù)雜的內(nèi)存中的數(shù)據(jù)結(jié)構(gòu),以及在這些模型中任意向前瀏覽或向后瀏覽的能力。這些限制使 SAX 很少被選擇用于操作或修改文檔。因?yàn)?SAX 解析器不能交流元信息,如 DOM 的父 /子支持,所以必 須跟蹤解析器處在文檔層次的哪個(gè)位置,即維護(hù)文檔中事件的狀態(tài)。在一個(gè)簡(jiǎn)單的序列中, SAX 可以得到文檔中的信息,它也是最快的方法之一。當(dāng)然,DOM 使用的實(shí)際內(nèi)存數(shù)量依賴于具體的 解析器,但通常 100KB 的文檔會(huì)占用1MB 的內(nèi)存。 ContentHandler 接口其中一些主要的方法有 startDocument、 endDocument、 startElement、 endElement、 Characters等。它不是 W3C 標(biāo)準(zhǔn),但它是一個(gè)得到了廣泛認(rèn)可的使用 Java 開發(fā)的 API,大多數(shù) SAX 解析器在實(shí)現(xiàn)的時(shí)候都遵循標(biāo)準(zhǔn)。由于 XML 的元素合理地進(jìn)行了嵌套,因此可以確定每一個(gè)元素被打開和關(guān)閉的時(shí)間以及許多其他問(wèn)題。基于事件的解析器和 這個(gè)很相似,但有一點(diǎn)不同,即在解析的過(guò)程中,應(yīng)用程序可能不在程序員的控制之下。對(duì)于非常大的文檔,這會(huì)引起顯著的延遲。在內(nèi)存中加載整個(gè)文檔和構(gòu)建完整樹結(jié)構(gòu)成本很高,尤其當(dāng)文檔非常大的時(shí)候。 DOM 使用起來(lái)也要簡(jiǎn)單得多。父元素表示樹的根部,每一個(gè)子元素代表根的子節(jié)點(diǎn),等等。 下圖給出了 DOM 如何處理結(jié)構(gòu)化數(shù)據(jù)的簡(jiǎn)化試圖。索引參數(shù)都是從 0 開始記數(shù)的。它定義了以下一系列的對(duì)象和方法對(duì) DOM 樹的節(jié)點(diǎn)20 XML 快速解析技術(shù) 進(jìn)行各種隨機(jī)操作: (1) Document 對(duì)象:作為樹的最高節(jié)點(diǎn), Document 對(duì)象是對(duì)整個(gè)文檔進(jìn)行操作的入口。 XML 把這些數(shù)據(jù)看作文檔,并且利用 DOM 來(lái)管理這些數(shù)據(jù)。 對(duì)于有效的 HTML 和格式規(guī)范的 XML 文檔, DOM(文檔對(duì)象模型)是一個(gè)API(應(yīng)用編程接口)。甚至可以說(shuō)“自行車”對(duì)象擁有一些方法: goto()、 stop()和 reverse()。事件需要一些操作來(lái)觸發(fā),為響應(yīng)這些操作而編寫的代碼就是事件句柄。按照對(duì)象層次關(guān)系,可以通過(guò)對(duì)象的屬性來(lái)訪問(wèn)包含在對(duì)象中的數(shù)據(jù)值。 如圖 所示, XML 解析器把原來(lái)由應(yīng)用服務(wù)器承擔(dān)的許多大量耗費(fèi) CPU 時(shí)負(fù)載均衡器 XML 解析器 應(yīng)用服務(wù)器 應(yīng)用服務(wù)器 ① ③ ⑤ ⑦ ⑨ 圖 XML 解析器工作模式 WEB 服務(wù)器 XML 文檔 DOM SAX VTD 圖 解析 XML XML解析器 第三章 XML 解析技術(shù)基礎(chǔ) 19 間的任務(wù)卸載到網(wǎng)絡(luò)上,這使得企業(yè)獲得線速性能的花費(fèi)大大降低了。 2) 負(fù)載均衡器直接將 XML 流量定向到 XML 解析器。讀取一個(gè) XML 數(shù)據(jù)的過(guò)程稱為解析。 XML 提供了在存儲(chǔ)結(jié)構(gòu)和邏輯布局上加上限制條件的機(jī)制。 XML 文檔是由稱為“實(shí)體”的存儲(chǔ)單元組成的。顯然,XML 解析器在 XML 應(yīng)用程序中有著重要的地位。 本章小結(jié) 本章主要介紹了 XML( eXtensible Markup Language) ——可擴(kuò)展標(biāo)記性語(yǔ)言的產(chǎn)生背景,較為詳細(xì)的講解了 XML 文檔的語(yǔ)法基礎(chǔ)和組成部分,簡(jiǎn)要介紹了它的相關(guān)標(biāo)準(zhǔn)。格式化屬性是以格式化對(duì)象的屬性形式出現(xiàn),格式化對(duì)象元素可以包含各種屬性, W3C 總共定義了兩百多個(gè)屬性,多數(shù)屬性都可以應(yīng)用于一個(gè)以上的格式化對(duì)象元素。 格式化將結(jié)果樹變?yōu)榭勺x的形式。其中源樹指的是轉(zhuǎn)換前的 XML 文檔,結(jié)果樹指的是處理器產(chǎn)生的新文檔,該新文檔可能是另一個(gè) XML 文件、一個(gè) HTML 文件甚至一個(gè)簡(jiǎn)單的文本文件。 利用 XSL,一個(gè) XML 文檔可以根據(jù)不同的表示要求有不同的表示形式。 XSL 是一種專門為 XML 設(shè)計(jì)的樣式語(yǔ)言,它直接架構(gòu)在 XML 語(yǔ)法之上,是XML 的一種應(yīng)用。 XPath 用于表達(dá)從XML 文檔中一點(diǎn)到另一點(diǎn)的路徑,“ /recipeBook/Part[3]/Recipe[3]”是一個(gè) XPath表達(dá)式,意思是要跟蹤該鏈接,應(yīng)從文檔頂層開始,找到 recipeBook 元素,然后在該元素內(nèi)找到第三個(gè) Part 元素,抵達(dá)此處后再尋找第三個(gè) Recipe 元素。連接叫做弧,并有一個(gè)方向。如果兩個(gè)元素同名但 URI 前綴不同,那么它 們就是不同的元素,從而避免了名稱沖突,擴(kuò)大了應(yīng)用范圍。 名域 XML 名域( Namespace)是一種“限定”一組元素和屬性的方法。當(dāng)實(shí)際使用模式并將它應(yīng)用于一個(gè)良構(gòu) XML 文檔,就會(huì)產(chǎn)生一個(gè)擴(kuò)充文檔,該過(guò)程稱為!ENTITY%Attdecl―CDATAREQUIRED‖ !ELEMENT books(book+) !ELEMENT book(author,title,price) !ELEMENT author(PCDATA) !ELEMENT title(PCDATA) !ELEMENT price(PCDATA) !ATTLIST book category%Attdecl published%Attdecl 屬性聲明 實(shí)體聲明 元素聲明 實(shí)體引用 圖 DTD 示例 ( ) 第二章 可擴(kuò)展標(biāo)記語(yǔ)言 13 模式檢驗(yàn)。 由于 DTD 存在結(jié)構(gòu)封閉、不支持名域、沒有數(shù)據(jù)類型和不是 XML 文檔等若干缺陷, W3C 后來(lái)開發(fā)了 XML 模式( Schema)。內(nèi)部 DTD 被包含在 XML 主文檔之中,而外部DTD 則是從 XML 主文檔中分離出來(lái)的一個(gè)單獨(dú)的文件。 12 XML 快速解析技術(shù) DTD 定義文檔的語(yǔ)法,而文檔的語(yǔ)法反過(guò)來(lái)能夠讓 XML 語(yǔ)法分析程序確認(rèn)某個(gè)文檔標(biāo)記使用的合 法性。盡管這個(gè)例子說(shuō)明了如何將一般的 XML 元素放在 CDATA 片段中,通常使用 CDATA 片段來(lái)將一段 XML 代碼引用出來(lái),尤其是在 XML 幫助以及其他 XML 文件中。通過(guò)將 CDATA 片段 ![CDATA[和 ]]之間來(lái)定義。 xml 處理指令中的version 屬性使得 XML 可以持續(xù)發(fā)展而不會(huì)由于存在不同的版本而產(chǎn)生問(wèn)題。處理指令是一些用來(lái)由處理 XML 文件的應(yīng)用程序使用的特殊指令。因?yàn)檫@會(huì)和 XML 的注釋語(yǔ)法發(fā)生沖突。為解析字符數(shù)據(jù)( CDATA)片斷是這一規(guī)則的唯一例外。與編程語(yǔ)言中的注釋一樣, XML 注釋被用來(lái)提供文件數(shù)據(jù)的說(shuō)明,這完全是為了用戶了解程序。是作為單引號(hào)與和號(hào)的別名的實(shí)體引用。apos。實(shí)體引用在 XML 中被用來(lái)為數(shù)據(jù)篇幅與別名??赵厥褂孟嗤姆椒▉?lái)說(shuō)明沒有相應(yīng)的結(jié)束標(biāo)記。因此, br標(biāo)記在XML 中的用法就變成了 /br。 XML 元素可以是空的,這意味著元素可以不含有任何解析的字符數(shù)據(jù)。 XML 解析器使用這些 DTD 來(lái)驗(yàn)證文件是否有效。 如果 DTD 完全嵌套在文檔中,那么它的說(shuō)明語(yǔ)句也在該文檔中,這叫做嵌套文檔類型說(shuō)明。 文件的文件類型聲明對(duì)于確定一個(gè)文件是否有效或是否僅僅是結(jié)構(gòu)良好的來(lái)說(shuō)是非常重要的。注釋可以出現(xiàn)在首部或文檔實(shí)例中,總是以“ !”字符開始,以“ ”字符結(jié)束。s Ratchet Service/pany /contact /addressbook 8 XML 快速解析技術(shù) 文檔示例的第一句 ?xml version=“ ” encoding=“ UTF8” standalone=“ yes” ?就是該文檔的 XML 說(shuō)明,它是 XML 文檔中最先出現(xiàn)的東西,由一個(gè)左尖括號(hào)、后跟一個(gè)問(wèn)號(hào)(沒有空格)、再跟三個(gè)字符 xml 組成。下面用該例子來(lái)具體講解不同 XML 語(yǔ)法組 成部分的作用。quot;”來(lái)分別代替“ ”、“ ”、“ amp。lt;”、“ amp。 ? 所有起始標(biāo)注必須有結(jié)束標(biāo)注,即所有 XML文檔都必須包含一個(gè)根元 素,這個(gè)根元素是包含了文檔所有內(nèi)容的最外層元素。處理指令可任意出現(xiàn)在文檔首部或文檔實(shí)例中。良構(gòu)文檔語(yǔ)法上正確,滿足 XML 規(guī)范描述的生成規(guī)則,但不一定符合某個(gè) DTD。 1996 年 11 月,在波士頓 SGML 世界年會(huì)上, Inter Homepage 的撰寫標(biāo)準(zhǔn) HTML 被宣告終結(jié),取而代之的是另一個(gè)電子文件格式化通用標(biāo)準(zhǔn) ——XML( Extensible Markup Language,可擴(kuò)展標(biāo)記語(yǔ)言)。不過(guò),由于 SGML 過(guò)于詳細(xì)和復(fù)雜,所以一直沒有在全球范圍內(nèi)被廣泛地采用。 第四章 在前三張的地主之上, 重點(diǎn)研究了 一種基于 XML 數(shù)據(jù)通信模型的設(shè)計(jì)與實(shí)現(xiàn)。 第二章介紹了 XML 文檔的特點(diǎn)和 XML 語(yǔ)法基礎(chǔ)以及相關(guān)技術(shù)和標(biāo)準(zhǔn),對(duì)全文的進(jìn)一步研究作了基礎(chǔ)性的鋪墊。如果 XML 解析器發(fā)現(xiàn) XML 文檔中的數(shù)據(jù)或者結(jié)構(gòu)不完整,就會(huì)向應(yīng)用程序報(bào)告一個(gè)“致命”錯(cuò)誤,而且不再會(huì)以正常的方式向應(yīng)用程序傳遞數(shù)據(jù)或 XML 結(jié)構(gòu)。 論文研究?jī)?nèi)容及結(jié)構(gòu) 應(yīng)用 XML 文檔主要有三個(gè)技術(shù)環(huán)節(jié),包括對(duì) XML 文檔的編輯、 XML 文檔的解析和顯示或使用 XML 文檔的數(shù)據(jù)。 然而,對(duì)不斷增長(zhǎng)的 XML 文檔的執(zhí)行引起了一個(gè)關(guān)鍵的問(wèn)題:由于文檔中每2 XML 快速解析技術(shù) 個(gè)元素都包含了相當(dāng)大的元數(shù)據(jù),所以 XML 文檔就包含了大量的數(shù)據(jù)。它獨(dú)立于任何語(yǔ)言和體系結(jié)構(gòu),是公認(rèn)的下一代網(wǎng)絡(luò)標(biāo)記語(yǔ)言。相對(duì)于 HTML 的“所見即所得”, XML 將數(shù)據(jù)和顯示信息分離,被稱為“文檔數(shù)據(jù)庫(kù)”,這就 使 XML 文檔很適合于描述數(shù)據(jù)庫(kù)中的數(shù)據(jù)。 關(guān)鍵詞: XML 解析; DOM; SAX。文中首先對(duì) XM