田喜平+牛紅惠+裴世凱
摘要:手工編輯生成XML 數(shù)據(jù)文檔不能適應(yīng)快速大量的數(shù)據(jù)交換要求,也很難滿足靈活多變的應(yīng)用需求。并且很多時候盡管代碼結(jié)構(gòu)類似,卻不能直接重用,使得每次工作都從零開始。文中分析了windows的文件系統(tǒng)中目錄樹和文件特點,討論了使用遞歸算法遍歷文件系統(tǒng)的方法,最終基于VS平臺使用C#語言完成了描述目錄樹的XML文檔的自動生成系統(tǒng)。所產(chǎn)生的XML文檔詳細地對目錄文件信息進行描述,方便在不同平臺下的數(shù)據(jù)處理。
關(guān)鍵詞:目錄樹;XML描述;文檔自動生成;C#
中圖分類號:TP311.5 文獻標(biāo)識碼:A 文章編號:1009-3044(2016)34-0112-03
Abstract: It is very difficult for XML document generated manually to meet the requirements for fast large amounts of data exchange, and to the flexible and diverse application requirements. Although codes are nearly resemble each other, they cannot be reused directly, which makes every work from scratch. This paper analyzed the characteristics of directory tree on Windows file system, discusses the method traversing the file system using recursion algorithm, and developed the system based on VS platform using c # language, which can automatically Generate XML Document of Directory Tree. These XML documents include the related information of directory tree, and provide convenience for data processing in different platform.
Key words: directory tree; XML description; automatic generation of document; C#
1 背景
目錄樹從根到各級子目錄項是一種有級別差隸屬關(guān)系的分支層次結(jié)構(gòu)[1],有關(guān)文件管理和調(diào)用的許多應(yīng)用都涉及目錄樹的查找和遍歷。在實際的應(yīng)用程序開發(fā)過程中,經(jīng)常會遇到如何查找某一文件以確定此文件的路徑問題,也會將通過目錄樹查找資源,如:圖片、文本等。
微軟提供了使用TreeView控件把數(shù)據(jù)按照樹形結(jié)構(gòu)組織并顯示出來,很直觀的描述復(fù)雜的層次關(guān)系[2]。但是使用此控件描述出來的層次關(guān)系很難將其保存出來,每次都要運行程序依次獲取信息信息。為了提高程序的運行效率,需要將將目錄樹的信息存儲起來,方便在程序中必然要去獲取和使用這些信息。有人試著使用數(shù)據(jù)庫存儲此部分信息[3],但是據(jù)庫存儲不能夠跨平臺而且用戶在使用的時候需要安裝龐大的數(shù)據(jù)庫軟件和做一些比較繁瑣的配置,為大多數(shù)對數(shù)據(jù)庫不熟的用戶帶了不便。
Xml是可擴展標(biāo)記語言[4],可以用它來描述事物的信息,且能夠完成的描述為樹形結(jié)構(gòu)。同時,Xml文檔是跨平臺,并且使用不需要用戶安裝任何的軟件和配置任何的參數(shù),通過XmlDocument類能夠直接對內(nèi)部信息進行操作。本文提出了一種目錄樹的XML文檔的自動生成方法。將可以自動將文件目錄樹中的相關(guān)數(shù)據(jù)轉(zhuǎn)換成XML 數(shù)據(jù)文檔,轉(zhuǎn)化出來的XML文檔能夠詳細對文件信息進行描述方便在不同平臺下對數(shù)據(jù)進行處理。避免了手工編輯生成XML 數(shù)據(jù)文檔不能適應(yīng)快速大量的數(shù)據(jù)交換要求。
2 文件目錄樹
Windows通過目錄樹的形式對文件和文件夾進行管理,如圖1所示。
結(jié)構(gòu)清晰,便于理解和讀取。采用樹形目錄結(jié)構(gòu)有如下優(yōu)點:1)解決了重名問題,允許不同的用戶用相同的名字去命名文件;2)有利于文件的分類,可以把不同類型的文件登錄在不同的子目錄下,便于查找和管理;3)能提高搜索文件的速度,可以從當(dāng)前目錄開始設(shè)置路徑(稱相對路徑),從而縮短搜索路徑,提高搜索速度;4)可防止用戶共享文件時破壞文件,對各級目錄或文件規(guī)定存取權(quán)限,凡能得到某級目錄權(quán)限的用戶就可得到該級目錄以及所屬的子目錄和文件,按規(guī)定的存取權(quán)限去使用目錄和文件,達到保護文件的目的。
XML是一種可擴展標(biāo)記語言 (Extensible Markup Language,),用于標(biāo)記電子文件使其具有結(jié)構(gòu)性的標(biāo)記語言,可以用來標(biāo)記數(shù)據(jù)、定義數(shù)據(jù)類型,是一種允許用戶對自己的標(biāo)記語言進行定義的源語言。XML 提供統(tǒng)一的方法來描述和交換獨立于應(yīng)用程序或供應(yīng)商的結(jié)構(gòu)化數(shù)據(jù)。并且在各種環(huán)境下都能夠提供了對XML操作的接口或類,如C#中提供XMLDocument操作xml文檔,C++中提供了---操作XML文檔,Java提供------操作XML文檔等。
3 基于C#的目錄樹的Xml描述文檔的自動生成
3.1 文檔的生成原理
對要生成xml文檔的目錄進行設(shè)定,設(shè)定完成后此目錄將是XML文檔的根節(jié)點。接著依次找當(dāng)前目錄下的每一個實體(文件或是子目錄),生成上一級目錄節(jié)點對應(yīng)的子節(jié)點;如果當(dāng)前目錄中包含子目錄,則遞歸調(diào)用節(jié)點生成函數(shù)將其設(shè)定為上一級目錄節(jié)點對應(yīng)的子節(jié)點,指導(dǎo)目錄將不包含子目錄了為止。這樣多個子節(jié)點生成函數(shù),反復(fù)進行遞歸調(diào)用,就可以實現(xiàn)對整個目錄樹的XML序列化。
3.2 具體實現(xiàn)
1)設(shè)置配置文件
Config文件能夠?qū)⒚钚羞x項和配置文件選項統(tǒng)一到一種數(shù)據(jù)結(jié)構(gòu)中。通過使用Config文件,能夠在外部設(shè)置項目中所用參數(shù),而無須修改代碼去設(shè)置相關(guān)的數(shù)據(jù),實現(xiàn)了配置選項和代碼分離。在本項目中,設(shè)置如圖2所示的Config文件,在此文件中完成了對要序列化的目錄樹、所生成的xml文件名、所保存的路徑等相關(guān)信息進行了設(shè)置。
2)定義xml節(jié)點信息
為了能夠?qū)⒛夸浐妥幽夸浀脑敿殬?biāo)注在xml文件中,定了xml節(jié)點的描述信息,通過類XmlNode來顯示,具體代碼如圖3所示。
3)xml文件的自動生成
根據(jù)所輸入要生成的序列化的目錄,寫一個遞歸遍歷方法完成序列化過程,并將序列化的結(jié)果寫入到xml文件中,算法的具體實現(xiàn)過程描述如下:
輸入:要序列化的目錄
輸出:根據(jù)目錄生成的xml文件
Step1:初始化相關(guān)信息(xml文件的保存路徑、名字;要被序列化的目錄的名字、路徑等);
Step2:判斷xml文件保存的路徑是否存在,如果存在則進行step3,否則跳轉(zhuǎn)step4;
Step3:則將原有的刪除,重新按照初始化信息生成保存路徑;
Step4:按照初始化信息直接生成保存路徑;
Step5:判斷要保存的xml文件路徑和要序列化的目錄樹是否為空,如果為空則拋出異常,否則繼續(xù)step6;
Step6:設(shè)置文件流和xml文本寫入對象;
Step7:設(shè)計一個遞歸遍歷方法完成xml信息寫入;
Step7.1:選擇的序列化目錄路徑;
Step7.2:判斷要序列化目錄路徑是否存在,如果存在則生成一個目錄對象,否則結(jié)束算法;
Step7.3:獲取目錄對象的相關(guān)信息,如:包含的子目錄個數(shù)和文件個數(shù);
Step7.4:生成xml文件的節(jié)點,此節(jié)點描述出目錄對象的相關(guān)信息,如:目錄名字和子目錄數(shù)量等;
Step7.5:判斷子目錄是否存在,如果存在則遍歷所有的子目錄,對每個子目錄遞歸Step 7.3直到當(dāng)前目錄中不存在子目錄為止;該目錄是否有子文件,有則進行Step7.6,無則進行Step8;
Step7.6:統(tǒng)計子文件所在目錄的名字和子文件的個數(shù),根據(jù)目錄名字生成xml的一個節(jié)點名,同時為這個節(jié)點添加其子節(jié)點個數(shù)的屬性。遍歷這個目錄的子文件集合,得到子文件的全路徑,生成一個與子文件的名字相同的節(jié)點,將該文件的路徑作為一個值寫進去。然后判斷這個目錄對象是否有子目錄,有則進行Step7.3,無則進行Step8;
Step8:關(guān)閉xml文件寫入和文件流。
4 應(yīng)用實例
根據(jù)上面的設(shè)計方案,開發(fā)了一款界面如圖4所示的系統(tǒng)。
選擇“Choose directory to use”框中的“browse”按鈕,打開window的瀏覽窗口,選擇要序列化的文件夾,例如本演示中選擇的的目錄:D:\xyx\語義文字。選擇“Choose directory to save”框中的“browse”按鈕,打開window的瀏覽窗口,選擇要保存文件位置,本實例中選擇的目錄是:D:\xmlFile。在“Input filename”后面的文本框中輸入所生成的xml文件的名字:myFirstXml。點擊“view”按鈕,則可看到在目錄D:\xmlFile下面生成了一個名字為myFirstXml的xml文件,如圖6所示。使用任何可以編輯xml文件的編輯器打開xml文件,會發(fā)現(xiàn)xml中的內(nèi)容如圖7所示,打開xml中的任何一個節(jié)點,能夠發(fā)現(xiàn)文字的根據(jù)文件中的內(nèi)容所標(biāo)注出來的的語義信息[5],如上下結(jié)構(gòu)中“吉”的語義信息如圖8所示。
5 結(jié)束語
本文描述了使用C#語言在VS2013環(huán)境下將windows中目錄信息使用xml文檔存儲的方法,展示了根據(jù)此方法做出來的系統(tǒng)及其應(yīng)用。所生成的xml文檔能夠跨平臺使用的而且不需要用戶安裝任何的軟件和配置任何的參數(shù),提高了程序的運行速度,為目錄樹訪問的項目開發(fā)提供了方便和支持。
參考文獻:
[1] 趙曉琴. 讓W(xué)indows7資源管理器也顯示目錄樹[J]. 電腦愛好者, 2012(1): 39-39.
[2] 周炎濤, 陳賢謀. ASP.NET中TreeView控件與數(shù)據(jù)庫結(jié)合創(chuàng)建動態(tài)目錄樹[J]. 航空計算技術(shù), 2004, 34(2): 25-27.
[3] 李貴輝, 宋秀云. 基于WEB的動態(tài)目錄樹創(chuàng)建與應(yīng)用[J]. 電腦知識與技術(shù): 學(xué)術(shù)交流, 2006(1): 71-72.
[4] 田中雨, 郭磊. XML實踐教程[M]. 北京: 清華大學(xué)出版社, 2016.
[5] 凌海云, 左志宏, 陳蘭, 等. 語義標(biāo)注元數(shù)據(jù)及其抽取技術(shù)[J]. 計算機應(yīng)用研究, 2004, 21(7): 147-149.